Windows (з тестами продуктивності)
У цій статті ми розглянемо питання найважливіші для початківців веб-програмістів і тих хто замислюється про вивчення Node.js, а саме:
- як встановити робоче оточення Node.js на своєму комп'ютері;
- як писати код;
- як налагоджуватися;
- Як розгорнути те, що вийшло на віддаленому сервері.
А випробування продуктивності наприкінці статті ймовірно дадуть відповідь на запитання навіщо саме вам може знадобиться досліджувати Node.js.
Встановлюємо робоче оточення
Для початку необхідно завантажити та встановити Web Platform Installer, запустити його, клацнути на "Options" і в полі "Display additional scenarios" додати посилання на Helicon Zoo Feed: http://www.helicontech.com/zoo/feed/

Після цього у Web Platform Installer з'явиться закладка Zoo:

Встановлення Node.js

Побачити всі доступні на даний момент веб фреймворки та програми можна в галереї Helicon Zoo. Після того, як ви погодитеся з ліцензійними угодами, почнеться завантаження та встановлення IIS (якщо ще не встановлено), Helicon Zoo Module, а також node.exe для Windows.
Важливим компонентом системи є менеджер пакетів Node Package Manager (npm), який знадобиться для встановлення додаткових модулів. На жаль, поточна версія npm на Windows працює нестабільно. Зате є його аналог - утиліта ryppi.py, яка може бути використана як і npm. ryppi.py написаний мовою Python, тому установка Node.js Hosting Package потягне за собою і пітон. У майбутньому, якщо npm стабільно працюватиме на Windows, ми замінимо їм ryppi.py, що дозволить заощадити 80мб дискового простору на установці пітона.
Встановлення шаблонів WebMatrix
Отже, ми встановили Node.js, тепер, щоб почати писати під нього програми, можна скористатися шаблонами для WebMatrix. Ці шаблони дозволяють створити порожні заготовки, які можна використовувати для подальшої розробки. Для їх встановлення оберемо Zoo -> Packages -> WebMatrix Templates.

Якщо WebMatrix у вас не встановлений - не біда, він буде завантажений і встановлений автоматично під час встановлення шаблонів до нього. Після встановлення запустимо WebMatrix і на головній оберемо Site from Template:

Як видно на скріншоті Node.js — це не єдиний фреймворк, для якого доступні шаблони WebMatrix.
Після створення Node.js Site, якщо перейти по вказаному URL або натиснути Run, ви побачите простий Hello, World!.

За замовчуванням новий сайт містить фреймворк express, для більш простого створення веб-додатків. Він сам та його залежності знаходяться в директорії node_modules під сайтом, що буде зручно для розгортання програми на віддаленому сервері.
Директорія public призначена для зберігання статичних файлів. Будь-який файл, поміщений у цю директорію, буде оброблений безпосередньо IIS як статичний файл, не викликаючи Node.js. Особливо важливо, щоб уникнути випадкового запуску клієнтських *.js файлів на сервері.
Файл web.config містить, зокрема, URL Rewrite правила для статичних файлів. Спочатку будь-який запит перевіряється наявність такого статичного файлу в директорії public. Це потрібно для деяких веб додатків, які люблять змішувати статичні та динамічні ресурси в одній директорії, частіше за кореневу. Якщо ваша програма не схильна до цієї, однозначно порочної практики, то видаліть правила для Microsoft URLRewrite з файлу web.config і посилайтеся на статичні файли, вказуючи директорію public очевидно.
А ще у файлі web.config містяться конфігураційні директиви, необхідні для запуску Node.js і Helicon Zoo Module на цьому сайті.
Пишемо перший додаток
Для демонстрації можливостей асинхронних веб фреймворків зазвичай насамперед пишуть чат. Так само відомий демо-додаток на Node.js - це чат на http://chat.nodejs.org/, його вихідні коди доступні для вивчення.
Ми також вирішили зробити максимально простий чат, щоб його вихідники повністю помістилися на сторінку хабра. У ньому немає ні користувачів, ні сесій, ні прокручування чи форматування повідомлень, є лише найпростіша асинхронна передача повідомлень для демонстрації роботи long-polling.
Для роботи використовуватимемо створений нами раніше Node.js Site. Потрібно буде редагувати файли server.js та index.html.

Ось вихідні коди файлу server.js:
Для набуття змін чинності потрібно натиснути Restart і потім Run:

Тепер можна переконатися, що чат працює, запустивши його у двох різних браузерах:

Встановлення модулів
Для будь-якого веб фреймворку можливо найважливішою характеристикою є доступність різних модулів та використання сторонніх технологій. У поточній реалізації менеджер пакетів Node (Node PackageManager) під Windows працює нестабільно, хоча підтримка Windows вже заявлена і незабаром ситуація може змінитися. На даний момент можна користуватися менеджером пакетів написаним на Python - ryppi.py. Тут потрібно пам'ятати одну тонкість — ryppi.py завжди встановлює модулі в директорію поточної директорії node_modules, де він викликаний. Тобто. щоб поставити модуль під сайт потрібно зайти до директоріїсайту та викликати там команду:
CoffeScript
Дізнатися більше про CoffeeScript: http://jashkenas.github.com/coffee-script/(англ.) Встановити CoffeeScript: rippy.py install coffe-script
Налагодження Node.js-додатків
Для налагодження програм на Node.js є хороший інструмент – node-inspector. Він уже включений до директорії node_modules, яка є у шаблоні Node.js-сайту. node-inspector працює так:
- програма, яку потрібно налагоджувати, запускається в debug-режимі (виклик node.exe з параметром --debug або --debug-brk);
- запускається node-inspector, який по суті також є веб-додаток;
- по WebSocket-протоколу ці два додатки спілкуються між собою передачі налагоджувальних даних;
- у браузері відкривається сторінка з додатком, що налагоджується;
- у webkit-сумісному браузері відкривається інтерфейс node-inspector з налагоджувальною інформацією, його інтерфейс аналогічний Web Inspector у Google Chrome або Safari.
У кореневій директорії node.js-сайту із шаблону є файл start_debug.cmd, який запускає налагодження для поточної програми та відкриває сторінки у браузері для налагодження.

Відладчик у браузері виглядає так:

Розгортання на сервері
Отже, ми написали веб-додаток і тепер хочемо викласти його в мережі. Для цього нам потрібний сервер, і тепер немає нічого простішого, ніж настроїти Windows сервер для роботи з Node.js. Нам лише доведеться повторити кілька кроків з початку статті, які ми робили для розгортання робочого оточення. А саме: поставити Microsoft Web Platform Installer, додати до нього Helicon Zoo feed та встановити Node.js Hosting Package з репозиторію Zoo. Все – сервер готовий прийняти нашу програму. Із серверних платформпідтримуються Windows 2008 та 2008 R2, 32 та 64 бітні версії.
Тепер потрібно тільки створити на сервері порожній веб-сайт, використовуючи менеджер IIS або хостинг панель, якщо ми робимо свій хостинг, і відкопувати наш додаток на сайт по FTP або WebDeploy. У випадку з WebDeploy буде ще й роздано необхідні права на папки. Можна також використовувати Git або іншу систему контролю версій, але це виходить за межі цієї статті.
Helicon Zoo Module спочатку розроблявся з розрахунком конфігурування хостинг рішень. Так усі додатки під ним розділені та не перетинаються. Сам модуль з налаштуваннями за замовчуванням працює в автоматичному режимі, створюючи один воркер (процес-обробник), коли навантаження мало або додаючи воркерів аж до числа ядер, щоб дати максимальну продуктивність, якщо навантаження на програму зростає.
У Helicon Zoo використовується концепція движків (engines) та додатків (applications). Так у двигунах визначається, що запускати і як, за яким протоколом і на якому порту, скільки мінімально і максимально воркерів дозволено і подібні глобальні налаштування, які задаються глобально у файлі applicationHost.config. Потім вже під сайтом можна створити програму, яка використовує конкретний двигун і передати йому необхідні параметри для роботи цієї програми. Це дозволяє відокремити роботу адміністратора хостингу від клієнтів, а клієнтів один від одного.
Тести продуктивності Node.js
Тестова машина як сервер - Core 2 Quad 2.4 Ghz, 8 Gb RAM, гігабітна мережа. Для генерації навантаження використовувався потужніший комп'ютер і Apache Benchmark командою ab.exe -n 100000 -c 100 -k. Для тестування Apache та Nginx використовувалася Ubuntu 11.04 Server x64. IIS 7 тести працювали на Windows Server 2008 R2. Жоднихвіртуалок – чесне залізо.
Було проведено три тести. У першому Node.js повинен був просто виводити на сторінці поточний час з високою роздільною здатністю. Час потрібно щоб гарантувати, що відповіді не йдуть з кешу. У другому тесті проводилося читання з бази даних MySQL, третьому запис до бази даних.
Ось результати (величина на графіках – запити за секунду):



Вражає, чи не так? Тепер трохи пояснень, що міряють ці тести. Називати їх тестами продуктивності можливо не зовсім правильно, адже ми не різні процесори міряємо. У процесора може бути продуктивність, а у веб-серверів швидше зворотний результат - скільки процесорного часу вони витратили на кожен запит.
Так у першому тесті вимірюються чисті накладні витрати на обробку запиту кожним конкретним веб-сервером та їх здатність використовувати ресурси процесора. Швидше ця зв'язка технологій на цьому процесорі повернути відповідь просто не в змозі. У цьому тесті сильно відстав Nginx на Windows, тому що в цій системі Nginx відкриває нове з'єднання з бекендом на кожному запиті. А ось Apache на Windows навпаки порадував пулінгом з'єднань та справжніми потоками.
Другий і третій тести показують, як змінюється частка накладних витрат веб-сервера на обробку запиту зі збільшенням «ваги» запиту. Однак на них тепер впливає безліч інших факторів, як то продуктивність файлової системи, драйверів бази даних і самої бази. Для експерименту ми протестували також зв'язку Windows+Zoo+MongoDB, просто щоб подивитися різницю з Mongo. Її результати – 6793 з/с на читання та 2906 з/с на запис. Вражає, особливо швидкість запису.
Ще один цікавий факт - програмно-апаратна база, використана вцих тестах та сама, що і при тестуванні Django в цій статті. Отже, результати цих тестів можна порівнювати. Зрозуміло, скрипти на Node.js набагато легковажніші, ми не використовували шаблонів, ORM і т.п. але все ж таки є привід задуматися.
На прохання читачів викладаємо докладні графіки ab. Повторно виміряли лише перший тест, там де простий виведення часу, тому що на ньому найкраще видно накладні витрати самого веб-сервера. Конфігураційні файли та тестовані js скрипти можна взяти тут. Там тільки інклуди, решта за замовчуванням. Горизонтальна шкала – запити, вертикальна – час відповіді в мілісекундах.
Windows, IIS7 + Zoo, "виведення часу":

Ubuntu, Apache, «виведення часу»:

Ubuntu, Nginx, «виведення часу»:

Я думаю, що Node.js — дуже перспективна технологія. Вона має вражаючу продуктивність і гнучкість. Особливо приємно, що Node.js однаково добре як на Unix, так і на Windows і використовує правильні для кожної з цих операційних систем технологічні рішення, що чітко видно за результатами тестів.
Скоро ми плануємо додати підтримку Erlang та Java в Helicon Zoo. Цікаво буде порівняти за продуктивністю ще ці технології. Поки ж Node.js є явним лідером за швидкістю серед підтримуваних веб фреймворків.
Автор статті: Ярослав Говорунов