GrabDuck

Писать веб-сайты на ассемблере полезно и приятно

:

Конечно, многие скажут, что это ни-ни и писать для веба нужно только на PHP, ну или на один из модерных языках Питон, Руби, Node.js и т.д.

Но дело в том, что написание сайтов на ассемблере очень полезно, а с подходящими инструментами — легко и приятно.

Вообще-то, это утверждение было лишь гипотезой. Чтобы доказать или отвергнуть ее, этой весной я занялся писать форум на ассемблере.

Раньше у меня уже было веб-приложение на ассемблере — CMS для малого сайта. Только оно работает в режиме "один пишет, многие читают". При том, использует CGI интерфейс и поэтому "многие" читать одновременно тоже не получается.


И так я решил написать веб-приложение, чтобы:


  1. Соблюдался принцип «много читают — много пишут».
  2. Работало очень быстро и не загружало сервер.
  3. Использовало очень мало памяти, опять чтобы не загружать сервер.
  4. Работало на дешевом виртуальном хостинге.

Всем этим условиям отвечает именно веб-форум. Поэтому выбор остановился на нем. Задание выглядит так:

Написать веб-форум, который:


  1. Использует интерфейс FastCGI, чтобы обслуживать заявки быстрее чем CGI и чтобы не было ограничения на число одновременно исполняющихся процессов на сервере (у моего хостинг плана есть такое ограничение в 60 30 процессов).
  2. Использует транзакционную базу данных, чтобы хранить информацию в одном месте и чтобы можно было нескольких посетителей писать одновременно.
  3. Функциональность должна быть достаточной чтобы использовать продукт в реальной жизни для общения пользователей.
  4. Вид форума было можно полностью менять из конфигурации. Скины — наше все. Да и не каждый может редактировать код на ассемблере.

Кроме FastCGI можно было использовать и SCGI, которой даже выглядит несколько проще для имплементации. Только оказалось, что моя хостинговая компания поддерживает только FastCGI.

Но об этом мне жалеть не пришлось. Оказалось, что несмотря на сложность спецификации, FastCGI очень хорошо подходит для реализации именно на ассемблере. Так что код получился простой и понятный.

Для базы данных была выбрана SQLite. Во первых, я знаю ее очень хорошо и часто использую ее в связке с ассемблером. Во вторых, используя виртуальный хостинг, хотелось чтобы все приложение находилось в директориях сайта, включая база данных. В третьих, у SQLite есть возможность "Full text search — FTS", которая работает быстро и придется очень кстати для поиска в форуме.

Но здесь появилась проблема. Форум я решил писать на 32 битном ассемблере для x86, чтобы можно было работать и на 32 и на 64 битных серверов. Но дело в том, что 64 битные серверы, как правило, не предусматривают 32 битных библиотек. Для ассемблера это не важно, но SQLite мне тоже нужна 32 битная, а ей нужна стандартная библиотека C. А вот glibc (GNU C library) нельзя скомпоновать статически.

Но решение нашлось — использовать альтернативную библиотеку C — MUSL у которой есть динамический линкер, которого можно поместить в директорию приложения. Дополнительной плюс является и то, что библиотека очень небольшая.

Реализация интерфейса FastCGI писалась так, чтобы ее можно было использовать и в других проектах.

Для разметки постов форума было решено использовать markdown подобную разметку, которая у меня уже была написана для CMS-а.


Писал я в свободное от работы время. Иногда на работе, иногда дома. Код, конечно открытый. Лицензия распространения: EUPL. Первая версия, сохранена 6-го Марта 2016-го года. Официальная версия 1.0, сохранена 7-го Апреля 2016-го года.

Все это заняло ровно 53 коммита.

Так как ассемблер я знаю, то больше всего затруднений во время работы вызвало незнание веб протоколов. Пришлось читать RFC документы насчет SMTP и FastCGI.

Умения веб дизайнера у меня тоже не выдающиеся, так что получилось так, как получилось. Но так как весь дизайн вынесен в конфигурационные файлы, то заменить его дело простое — нет необходимости менять код движка.

Так же, в начале мне совершенно ничего не было известно насчет XSS атаки и других аспектах веб безопасности. В конце, все более-менее изъяснилось. Особенно во время тестов, которые проводили некоторые товарищи из болгарского форума. В результате, появилась защита от ботов, а также тема в которой были 15000 постов.

Приложение получилось очень маленькое. Все файлы в дистрибуции 1.8МБ, от которых 992КБ SQLite и 622КБ MUSL библиотека. Само приложение на ассемблере состоит из одного файла "engine", размером в 68.5КБ (v1.2). Все остальное — темплейты и картинки.

Инсталляция очень простая — архив распаковывается в директорию сайта и настраивается '.httaccess' файл. Ну или 'lighttpd.conf'. Открывается сайт в браузере и создается пользователь-администратор.

Во время исполнения, приложение использует приблизительно 2МБ RAM на сервере, на запущенном процессе. В зависимость от нагрузки, apache сервер может запускать несколько экземпляров процесса.

К сожалению никакие сравнения с другими форумами не могу привести, потому что данных насчет потребления памяти популярных форумов не публикуются (ну или я не нашел) но типовое потребление памяти например cpanel, около 20МБ на PHP процесс — примерно в 10 раз больше.

Демо инсталляция форума доступна для посещения и тестов.

Хостинг план, на котором находится демо, (самый дешевый который я смог взять), виртуальный (shared). Ограничения таковы (согласно спецификации):


  1. Одноядерное CPU
  2. 1GB RAM
  3. 30 минут процессорного времени в сутки.
  4. Максимальное количество работающих процессов — 60.

В Августе совершенно случайно удалось протестировать систему на нагрузке в реальном режиме. Некто (так и не понял кто) опубликовал в Твиттер ссылку на хранилище кода. Сразу несколько десятков перепостили ссылку, а потом опубликовали ее и в reddit и наверное в других социальных сетях.

К большому моему сожалению, ссылка была на хранилище кода. А оно работает на CGI (fossil) и совершенно не держит нагрузки.

В течение суток форум посетили несколько тысяч посетителей — около 8000 на хранилище кода, которое счастливо падало и вставало (из-за превышения лимита процессов).

Но некоторое количество посетителей (около 3000) все-таки попали на форум и сделали более 30000 заявок.

Форум совершенно не почувствовал нагрузку и все время исправно работал без замедления или потери заявок. В эти сутки использовано около 7 минут процессорного времени.


Я считаю, что всем этим гипотеза сформулированная в начале моего рассказа, была доказана.

Веб программирование на ассемблере возможно, не очень сложно, а результаты получаются весьма хорошие. В результате, такая работа весьма повышает общую культуру разработчика и позволяет ему получит глубокое понимание протоколов Интернет и как все работает на самом деле.

Использование веб программы на ассемблере может сэкономить на хостинге и позволит использовать дешевый виртуальный хостинг там, где другие используют выделенные серверы и другие дорогие решения.


Ну, вот и все. Если кому понравилось, используйте на здоровье. Всякие тесты на уязвимость и производительность весьма приветствуются. Новый код и исправления багов принимаются. Новые хорошие скины тоже весьма нужны.

И в конце некоторые ссылки:

» Хранилище кода проекта
» Демо инсталляция
» Как качать и инсталлировать
» Как зарегистрироваться без почты