… или как перейти с PHP + JavaScript на JavaScript + JavaScript
Идея реализовать проект на сервер-сайд JavaScript была уже давно. Проблема была в отсутствии подходящего серверного программного обеспечения. Существующие открытые проекты не устраивали по разным причинам. Устанавливать дополнительный модуль для
Apache было не самой хорошей идеей, потому что производительность и оптимизация использования памяти при этом были бы не на высоте. С помощью
jslibs можно настроить FastCGI, но очень не хотелось оставлять ни малейших шансов «502 Bad Gateway», проект
ngx_http_js_module так и остался в зачаточной стадии, а
ngxv8 недостаточно развит для реализации реальных приложений. Поэтому я решил сделать собственную реализацию серверного javascript. Причем постараться сразу запрограммировать всю базовую функциональность, чтобы можно было ее тестировать в условиях, близких к реальности.
В качестве основного веб-сервера было решено использовать
nginx, в качестве «движка» javascript — TraceMonkey (javascript-движок из
Mozilla Firefox, бывший SpiderMonkey), и написать модуль для nginx, который бы их «склеил». Ничего сложного, на первый взгляд, но очень хотелось иметь определенную функциональность (и это получилось!), чтобы можно было нормально работать дальше. Большинство идей заимствованы, кстати, из
PHP.
- Корректная работа в multi-thread условиях
- Возможность выполнять скрипт, указанный в URL, а не настраивать отдельно скрипт-обработчик и функцию-обработчик для каждого location
- Возможность вызывать include(), sleep(), alert() из скрипта, использовать __FILE__ и __LINE__
- Ограничение памяти, выделяемой каждому скрипту, и времени работы скрипта
- Защита открываемых скриптом файлов, указав в настройках список разрешенных папок. Примерно как open_basedir в PHP
- Автоматический разбор данных запроса (параметров GET, POST, и, конечно же, cookies), чтобы не писать обработку данных на javascript
- Поддержка запросов application/x-www-form-urlencoded и multipart/form-data
- Поддержка basic-авторизации
- Работа с базами данных (в первую очередь, MySQL и SQLite)
- Работа с файловой системой: чтение и запись файлов, проверка существования файлов, и т.п.
- Кэширование байт-кода скриптов, как, например, в eAccelerator
Плюс некоторые другие возможности (инструменты для шаблонизации, для создания конфигурационных файлов, и т.п.), но их в основной список я не включил — их позволяют сделать языковые возможности TraceMonkey.
От слов — к делу! Как скомпилировать и настроить, как протестировать и сравнить...