UPD 2011-04-08: Внимание! Всё это старье, и лежит здесь только для истории.
Подготовка
Чтобы не отвлекаться от процесса сборки нжинкса, заранее скачаем все необходимые файлы:
- последний стабильный нжинкс (у меня был nginx 0.6.34)
- релиз SpiderMonkey (на этот момент версия 1.7.0)
- свежая версия NSPR (здесь использовалась 4.7.3)
- и собственно ngx_http_js_module версии 0.1 (UPD: теперь и на ГитХабе по тегу 0.1)
Собираем 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. Скачал для написания поста новый архив, версия не изменилась, а содержимое архива изменилось. И не завелось. Чтобы уберечь вас от этих проблем, припас именно те файлики, которыми пользовался сам. Предлагаю в случае чего скачивать вот эти архивы:
Смотрите также
- Искать описание структур и функций удобно на lxr Эмиллера.
- Интересная статья Робина Миллза о том, как собрать SpiderMonkey с поддержкой класса
File. Ее лучше читать с отключенными стилями и картинками ;) - Думаю, пригодятся доки по классу
File. - Может понадобиться и другая версия доков про
File. - Firefox на сервере: Aptana Jaxer. Впечатлил, но о нем потом.