Pull to refresh

Установка node.js на Linux, FreeBSD, Windows

Reading time 6 min
Views 84K
node.js — серверный асинхронный Javascript, превосходный инструмент для создания серверной части COMET приложений, в частности, для игрушек, чатов, и других высоконагруженных проектов, использующий синтаксис Javascript, прекомпилируемый в машинный код, работающий на скорости, сравнимой с кодом на C++, очень быстрый, способный держать 10 — 12 тысяч подключений, и не создающий отдельного процесса/не интерпретирующий себя заново/не запускающий процесс при каждом новом клиенте. Использует в качестве основы V8 — движок Javascript от Google. Удобные возможности, можно установить значение переменной при одном посетителе, и считать это значение при ответе другому.
Обращаю внимание на то, что если вы не программировали, например, на Python или Ruby, только на PHP, не обходите его стороной, это не ещё один незнакомый язык. И в этом его преимущество — Javascript — знакомый язык, особенно для тех, кто программировал на PHP+Javascript, но PHP не позволял очень многих вещей, особенно в связке с Apache, например, аплоад файлов с полосой загрузки (без Flash), возможность низкоуровневого управления сетью (возможность написать, например, клиента или сервер Mysql или прокси-сервер вроде nginx).
О гибкости языка говорит тот факт, что расширения для работы с MySQL, например, написаны на самом Javascript.
Я планировал написать статью с описанием этой замечательной системы, с примерами, но на момент чтения читателю хорошо бы иметь под рукой установленную версию node.js. Поэтому этот пост о том, как установить node.js, в том числе и на Windows, что актуально в связи с недавним появлением порта под cygwin. (Да, есть информация о том, где скачать node.exe)

Важное замечание.


В первую очередь хочу обратить внимание на то, что с развитием node.js его синтаксис менялся, порой несколько раз. В связи с этим, категорически не рекомендую использовать старые версии node, проскальзывающий недавно node.NET, и подобные сборки. Идеально — версия 0.1.90 или новее. По той же причине будьте внимательны при нахождениии в сети туториалов по установке. Те, что начинаются с wget http://s3.amazonaws… загрузят устаревшую версию.
Перед установкой убедитесь в том, что python установлен, он нужен для конфигурации и сборки с помощью make (актуально для всего, кроме Windows в некоторых случаях).

GNU/Linux


Под Linux node.js ставится проще всего.
Заходим на nodejs.org
Копируем ссылку на исходники
wget http://nodejs.org/dist/node-v0.1.97.tar.gz
tar -xvf node-v0.1.97.tar.gz
//либо делаем так
git clone git://github.com/ry/node.git (если git есть)
cd node*
./configure
make
make install

Хабрахабр советует в коментариях:
Programmer
Лучше было бы собрать как минимум при помощи checkinstall
checkinstall --fstrans=no --install=no --pkgname=node.js --pkgversion "0.1.97" --default

Логика подсказывает, что под MacOS установка будет аналогичной, проверить не могу. Разработчики тестируют своё детище на MacOS, работать должно без проблем.

FreeBSD


У меня VDS на FreeBSD, и поэтому для меня эта система наиболее актуальная. Вместе с тем, разработчики не тестируют node.js на FreeBSD, поэтому возможны некоторые проблемы.
Перед установкой необходимо убедиться в наличии libexecinfo. Ставится он так:
cd /usr/ports/devel/libexecinfo
make install

Так же подсказали,
hilobok:
На FreeBSD чтобы не собирать libexecinfo из портов достаточно сделать:
pkg_add -r libexecinfo

Итак, классический способ#1
cd /usr/ports/www/node
make
make install

Тот, что доктор прописал, рекомендуется всем. Тем, кто не знал о том, что node присутствует в портах — знайте.
Способ#2
Если у портах node отсутствует, можно попытаться установить с помощью классического способа, описанного выше (под Linux): wget или git clone; tar -xvf; configure; make и т.д.
Но, судя по всему, таким способом не выйдет установить node на 64-битную систему.
Способ#3
Если возникли какие-либо проблемы (а у меня возникали), есть очередной способ.
Заходим на страницу www.freebsd.org/cgi/query-pr.cgi?pr=145641
Скачиваем файл node-0.1.90.shar
Или создаём файл node-0.1.90.shar и заполняем его содержимое вручную (для тех, у кого wget споткнётся о знак амперсанда в url, и не хочется разбираться, в чём дело).
Говорим:
sh node-0.1.90.shar
cd node
make
make install

Подобные файлы (.shar), ежели они будут появляться впоследствии, можно будет найти тут: b23.ru/exxw
Способ от AterCattus
При сборке под FreeBSD 8.0_RELEASE amd64 с первого раза не собралось:
...obj/release/cpu-profiler.o(.text._ZN2v88internal23ProfilerEventsProcessor19FunctionCreateEventEPhS2_i+0x81): In function `v8::internal::ProfilerEventsProcessor::FunctionCreateEvent(unsigned char*, unsigned char*, int)':
: undefined reference to `v8::internal::OS::ReleaseStore(long volatile*, long)'
obj/release/cpu-profiler.o(.text._ZN2v88internal23ProfilerEventsProcessor15CodeCreateEventENS0_6Logger16LogEventsAndTagsEiPhj+0xa3): more undefined references to `v8::internal::OS::ReleaseStore(long volatile*, long)' follow
scons: *** [obj/release/mksnapshot] Error 1
scons: building terminated because of errors.
Waf: Leaving directory `/home/atercattus/node.js/node-v0.1.97/build'
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
*** Error code 1

Помогла эта ссылка: code.google.com/p/v8/issues/detail?id=726.
Там все просто, в v8/src/platform-freebsd.cc добавляется между int OS::ActivationFrameAlignment() и const char* OS::LocalTimezone(double time) реализация недостающей функции:
void OS::ReleaseStore(volatile AtomicWord* ptr, AtomicWord value) {
__asm__ __volatile__(""::: «memory»);
*ptr = value;
}

Может кому поможет.

Обновление на момент 11 июня
Вышеприведённый патч не актуален для последней версии из git — само прекрасно компилится под freebsd-amd64

Установка под Windows


Забудьте про .NET версию, по крайней мере, до появления порта версии 0.1.90 (см. примечание выше). Придётся использовать Cygwin. Тут есть два способа — находите, качаете, ставите Cygwin, добавляете python, g++, другие зависимости, возможно правите ручками исходники node… Если есть время и желание — пожалуйста, в таком случае Cygwin-совместимый порт брать тут.
Я предлагаю более простой вариант:
Скачиваем архив с прекомпилированным node.exe: drop.io/2dwcadi или dl.dropbox.com/u/626643/node-cygwinx86.zip — зеркало на dropbox. Это последняя версия, доступная для Cygwin (0.1.95), кроме того, для неё cygwin и не нужен (она portable). Распаковываем.
Есть еще один запасной вариант, через colinux: bit.ly/9hCjHO
Примечание:
azproduction:
Для пользователей windows (если у вас node.exe и server.js лежат в разных местах) команда для запуска из-под Cygwin версии будет:
node.exe /cygdrive/буква_диска/путь/до/скрипта/server.js
относительные пути не понимает, windows пути с любыми слэшами тоже не понимает.

Также небольшой апдейт — на данный момент (11 июня) из-под cygwin можно собирать оригинальный node.js, скачав его с помощью git.

Тест — драйв


Для запуска создаём файл, например, server.js. Содержимое-образец можно взять на nodejs.org.
В cmd переходим в распакованную папку и говорим:
node.exe server.js
В *nix аналогично, переходим в распакованную папку и говорим:
node server.js
Обращаю внимание, что тормоз в две секунды в примере — это не тормоз, а специальная отсрочка отдачи, реализованная через setTimeout, просто в качестве демонстрации возможностей.
Мой любимый пример немного другой:
var sys = require('sys'),
http = require('http');
var i=0;
http.createServer(function (req, res) {
i++;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World'+i+'\n');
res.end();
}).listen(8000);
sys.puts('Server running at 127.0.0.1:8000/');

Обратите внимание на инкремент переменной при обновлении страницы.
Чтобы выключить сервер/перезагрузить с другим скриптом, нажмите Ctrl+C (и заново запустите node). Обратите внимание, что если вы запустите node через putty, например, то при закрытии консоли node выключится. Я думаю, разобраться в этом несложно, самый простой вариант — запускать screen, либо демонизировать процесс, добавив node в /etc/init.d, выключая при помощи команды stop или killall node. Подробнее о такой установке (на английском) тут.
Это всё.

Настройка nginx


Далее, ваш сервер, скорее всего, будет работать на 80 порту, а node, например, на 8000. Чтобы было удобнее писать скрипты с красивыми адресами, настраиваем nginx, прописывая в конфиге:
location /ajax/ {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Как замечено в комментариях, эта конструкция не подходит для настоящих проектов, и надо настраивать Timeout, размеры сообщений, и т.д. кроме того, всё равно придётся настраивать количество одновременнызх подключений в самой системе. Т. е. эта конструкция подходит для ознакомления и для тестирования.
Теперь при запросе example.com/ajax содержимое отдаст node.js.
Обратите внимание, скрипт, запущенный в node в таком случае определит url не как равным '/ajax/', а именно как '/'.
На этом можно остановиться, получив рабочий node.js, можно начинать его трогать ручками. Эта штука — действительно замечательна. Напоследок несколько ссылок:
nodejs.org/api.html Документация
kuroikaze85.wordpress.com/all-node-js-entries — Сборник статей о node хабрачеловека Сергея Широкова (kurokikaze).
howtonode.org — статьи и заметки на английском Тима Касвелла (Tim Caswell aka creationix).
Tags:
Hubs:
+56
Comments 48
Comments Comments 48

Articles