Використання лише Node.js порівняно з використанням Node.js з Apache / Nginx


224

У яких випадках слід вважати за краще використовувати Node.js лише як сервер у реальному розгортанні?

Якщо ви не хочете використовувати лише Node.js, що краще грає з Node.js? Apache чи Nginx?

Відповіді:


207

Є кілька вагомих причин вставити ще один веб-сервер перед Node.js:

  • Не потрібно турбуватися про привілеї / настройки для процесу Node.js. Лише корінь може зазвичай прив'язуватися до порту 80. Якщо ви дозволите nginx / Apache турбуватися про те, що він починається як root, прив'язується до порту 80, а потім відмовляється від його кореневих привілеїв, це означає, що вашій програмі Node це не потрібно турбувати.
  • Обслуговування статичних файлів, таких як зображення, css, js та html. Вузол може бути менш ефективним порівняно з використанням відповідного веб-сервера статичних файлів (Вузол також може бути швидшим у вибраних сценаріях, але це навряд чи буде нормою). Крім файлів, які обслуговують ефективніше, вам не доведеться турбуватися про обробку eTags або кеш-заголовків керування так, як ви, якби ви обслуговували речі з Node. Деякі рамки можуть вирішити це за вас, але ви хочете бути впевнені. Незважаючи на те, все ще, мабуть, повільніше.
  • Як згадував у своїй відповіді Метт Сержант, ви можете легше відображати змістовні сторінки помилок або повертатися на статичний сайт, якщо служба вашого вузла виходить з ладу. В іншому випадку користувачі можуть отримати тимчасове з'єднання.
  • Запуск іншого веб-сервера перед Node може допомогти пом'якшити недоліки безпеки та DoS-атаки проти Node. Для реального світу , наприклад, CVE-2013-4450 це запобігти, запустивши що - щось на зразок Nginx перед Node .

Я застережу другу точку кулі, кажу, що ви, ймовірно, можете подавати свої статичні файли через CDN або з-за кешування-сервера, як Varnish. Якщо ви це робите, насправді не має значення, чи походження Node або Nginx або Apache.

Caveat конкретно з nginx: якщо ви використовуєте веб-розетки, обов'язково використовуйте останню версію nginx (> = 1.3.13), оскільки вона лише додала підтримку оновлення з'єднання, щоб використовувати веб-розетки.


11
express.staticобробляє ETags та заголовки кеш-пам'яті просто чудово.
— robertklep

18
Вузол не так добре, так? centminmod.com/siegebenchmarks/2013/020313/index.html , zgadzaj.com/…
— el vis

4
pauljz, у вас є орієнтири, щоб створювати резервні копії повільніше? статті @pawlakpp вказували, здається, Node.js набагато швидше під навантаженням.
— Самуель Нефф

3
Тут є деякі пов'язані з цим дискусії: stackoverflow.com/questions/9967887/… з деякими додатковими перспективами. Тести там (оскільки ви попросили додаткові орієнтири) показують, що node.js / express, навіть кластеризований, помітно не працює. Я вважаю, що найкраще зберігати подання статичних файлів і обробку запитів повністю з циклу подій вузла, зберігаючи ці цикли для роботи, яка повинна відбутися в Вузлі. Але якщо чесно, якщо ви будете подавати статичні речі з Node, вам теж буде добре. Це не велика справа.
— pauljz

4
Слід зазначити, що якщо ви використовуєте лише вузол безпосередньо, ви все одно можете прив’язати до зарезервованих портів, таких як :80без запуску вузла як root, просто використовуючи authbind: thomashunter.name/blog/using-authbind-with-node-js
— wyqydsyq

70

Просто для того, щоб додати ще одну причину до відповіді pauljz, я використовую сервер переднього кінця, щоб він міг обслуговувати 502 сторінки помилок під час перезавантаження сервера резервного сервісу або він збоїв з якихось причин. Це дозволяє вашим користувачам ніколи не отримувати помилки про неможливість встановлення зв'язку.


28

Я вважаю, що використовувати Node для обслуговування статичних файлів добре за будь-яких обставин , якщо ви знаєте, що ви робите . Безумовно, нова парадигма використовувати сервер додатків для обслуговування статичних файлів, оскільки стільки конкуруючих технологій (PHP, Ruby, Python тощо) потребують веб-сервера, як HTTPD або Nginx перед серверами додатків. .

Кожна об'єктивна причина, яку я коли-небудь читав, проти обслуговування статичних файлів з Node, обертається ідеєю використання того, що ти найкраще знаєш, або використання того, що сприймається як краще перевірене / стабільне. Це дуже поважні причини, практично кажучи, але мають мало суто технічне значення.

Якщо ви не знайдете функцію, яка є можливою на класичному веб-сервері, який неможливий з Node (і я сумніваюся, що ви це зробите), виберіть те, що ви краще знаєте, або з чим ви хочете працювати з тим, як будь-який підхід є нормальним.

Що стосується Nginx проти Apache - вони будуть «грати» з Node так само. Ви повинні порівнювати їх, не зважаючи на Вузол.


2
Хороший погляд на технічні порівняння взагалі: "Кожна об'єктивна причина, яку я коли-небудь читав, проти обслуговування статичних файлів з Node, обертається ідеєю використання того, що ти найкраще знаєш, або використання того, що сприймається як краще перевірене / стабільне. Це дуже вагомі причини практично кажучи, але мають мало суто технічне значення ". Занадто багато порівнянь в наші дні є упередженими та ґрунтуються на багажі досвіду та рівня комфорту на нижчих, але перевірених часом технологіях.
— Сонячно

Так, але вони справді / суб'єктивні / причини. Прекрасним прикладом об'єктивної причини може бути орієнтир - більшість з яких я знайшов вказують на nginx> nodejs (хоча я справді повинен робити своє ....)
— Нік

@Nick Ви абсолютно праві. І є декілька там, хоча я не є експертом у науковому маркуванні, тому я дозволяю людям шукати в Інтернеті. Що я скажу, але думаю, що є користь від простоти використання одного сервера замість двох. Лише менше потенціалу, щоб щось пішло не так. З іншого боку, у Nginx зазвичай є пакет для кожної Unix-подібної системи з хорошою конфігурацією, тоді як з Node потрібно розібратися в інтеграції systemd, pm2і т. Д. Отже, є плюси і мінуси, і користувач повинен вибрати свою отруту, так би мовити .

Я подумав, що це навпаки - вузол буде краще працювати при навантаженні (можливо, не з чистою незавантаженою швидкістю), оскільки він не повинен передавати процес подачі файлів за запит, а навпаки, може передавати дані, коли локальний диск або віддалений клієнт готовий на тій самій нитці, що і всі інші тисячі клієнтів. Це, звичайно, руйнується, коли у вас є кілька процесорів. Якщо тільки вузол не знає, як ними зараз користуватися. Або веб-сервери можуть використовувати кооперативну багатозадачність для сервірування статичних сторінок.
— Gerard ONeill

1

Додатково: Важливо також, якщо вам потрібен зворотний проксі, наприклад, щоб виконати сервер Websocket на тому ж порту, або, можливо, змішати деякі технічнлоги (відповісти NodeJS на деякі запити та з PHP деякі інші чи будь-що інше)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.