Блог Конфуция
ngx_http_js_module-0.1 07.12.2008

UPD 2011-04-08: Внимание! Всё это старье, и лежит здесь только для истории.

Подготовка

Чтобы не отвлекаться от процесса сборки нжинкса, заранее скачаем все необходимые файлы:

Собираем SpiderMonkey с поддержкой файлов

Сначала скомпилим и установим NSPR. Без него у нас не будет поддержки класса File внутри SpiderMonkey.


cd nspr-4.7.3/mozilla/nsprpub/
./configure
make
sudo make install

Затем скомпилим и установим SpiderMonkey. Официальный способ сборки требует для конфигурации autoconf версии 2.13 от 1999 года (говорят, версия 2.50 и выше не подойдет). Скажу честно, собрать SpiderMonkey официальным способом так и не получилось. Да еще в мануале не пишут, как здесь включить поддержку файлов. Но, на всякий случай, вот этот способ:


cd js/src
autoconf-2.13
./configure
make
sudo make install
Если все собралось и установилось — прекрасно. Но файлов не будет, а без них нельзя.

Нам достаточно собрать SpiderMonkey по старинке:


cd js/src
JS_HAS_FILE_OBJECT=1 \
CFLAGS="-I/usr/local/include/nspr" \
OTHER_LIBS="/usr/local/lib/libnspr4.dylib" \
make -f Makefile.ref
Вам, возможно, надо заменить значения переменных CFLAGS и OTHER_LIBS на значения принятые в вашей системе.

Теперь проверим наличие рабочего класса File:


echo "print (new File('.').parent)" | ./Darwin_DBG.OBJ/js
#=> /Users/developer/Downloads/js/src

И установим SpiderMonkey. Так как не работает make install, придется самим раскладывать все файлы по своим местам. На моем компе это делается так:


# внутри js/src
OBJ="Darwin_DBG.OBJ"
sudo cp $OBJ/js /usr/local/bin
sudo cp $OBJ/libjs.a /usr/local/lib
sudo cp $OBJ/libjs.dylib /usr/local/lib

sudo mkdir -p /usr/local/include/js
sudo cp $OBJ/*.h /usr/local/include/js
sudo cp *.h /usr/local/include/js
sudo cp *.tbl /usr/local/include/js
Замените Darwin_DBG.OBJ на то, что получилось у вашего компилятора. Исходники SpiderMonkey нам больше не нужны, их можно убрать, чтобы не мешали.

Собираем nginx c ngx_http_js_module

Распакуем nginx_http_js_module.tgz. Для удобства предположим, что у нас есть директория /stuff и в ней лежит папка с нашим модулем: /stuff/ngx_http_js_module.

Сконфигурируем и скомпилируем нжинк с яваскриптом:


cd nginx-0.6.34
./configure --add-module=/stuff/ngx_http_js_module
make
Если у вас уже установлен нжинкс той версии, которую мы собрали, то выполнять make install не нужно. При запуске нжинкс будет искать mime.types и другие файлы в своей директории /usr/local/nginx/. Если вы уже ставили нжинкс, то эта директория существует и в ней есть все необходимые файлы. Если нет, то после make выполните make install.

Потестим

Запустим:


# внутри nginx-0.6.34
sudo mkdir -p /usr/local/nginx/js
sudo cp /stuff/ngx_http_js_module/js/* /usr/local/nginx/js/
export JSLIB="/stuff/ngx_http_js_module/lib"
./objs/nginx -c /stuff/ngx_http_js_module/nginx.conf
Опросим:

curl http://localhost:8080/
#=> ... Welcome to nginx! ...
curl -v http://localhost:8080/test/page
#=> Привет, Девелопер!
#=> Ты вызвал страницу /test/page, методом GET, с IP 127.0.0.1

И небольшой тест на скорость:


ab -kc 10 -n 500 http://127.0.0.1:8080/test/page

Concurrency Level:      10
Time taken for tests:   0.075 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      127000 bytes
HTML transferred:       58500 bytes
Requests per second:    6668.53 [#/sec] (mean)
Time per request:       1.500 [ms] (mean)
Time per request:       0.150 [ms] (mean, across all concurrent requests)
Transfer rate:          1654.11 [Kbytes/sec] received
Тестил на первом поколении интеловских маков: Intel Core Duo 2 ГГц, 2 Мб кеша второго уровня, 1 Гб оперативки.

Ура!

Яваскрипт оказался очень шустрым. Два месяца назад тестовая сборка дала всего около 3000 запросов в секунду. Сегодняшняя версия дала 6600. Тестировал на одном и том же маке. Могу найти только два объяснения: либо нжинкс так прибавил в скорости, либо SpiderMonkey серьезно вырос за последнее время. Возможно, и то и другое. Получается, что используя фаерфокс, мы не только укрепляем клиентскую сторону веба, но и заглядываем в будущее серверной стороны. Как-то так.

Что дальше?

Расскажу, как устроен модуль внутри. Как он крепится к нжинксу, и как нжинкс обменивается данными с яваскриптом. Это, на мой взгляд, будет самое интересное. Архитектура нжинкса захватывает сложностью. Яваскрипт очень элегантен в своей простоте. Они такие разные.

Если не заводится

Иногда бывает так, что используешь указанные в руководстве версии, все делаешь правильно, а ничего не получается. Вот и со мной так было со SpiderMonkey 1.7.0. Скачал для написания поста новый архив, версия не изменилась, а содержимое архива изменилось. И не завелось. Чтобы уберечь вас от этих проблем, припас именно те файлики, которыми пользовался сам. Предлагаю в случае чего скачивать вот эти архивы:

Смотрите также

Теги:
  • сервер
  • javascript
  • nginx
  • ngx_http_js_module
  • serverside javascript
  • spidermonkey
Очень жду ваших комментариев на почту или на гитхаб.