node.js або інтерфейс nginx для обслуговування статичних файлів?


90

Чи існує швидше тестування або порівняння: розмістіть nginx перед вузлом і дайте йому безпосередньо обслуговувати статичні файли, або використовуйте лише node і використовуйте статичні файли, використовуючи його?

Рішення nginx здається для мене більш керованим, будь-які думки?


3
Я б сказав, що це також залежить від кількості конфігурації та коду, який потрібно написати для використання одного сервера над іншим. Якщо ви не очікуєте виходу на IPO, а ваш сервер додатків уже налаштований і робить все, що вам потрібно, тоді ви можете просто дотримуватися його, поки цього буде недостатньо.
m33lky,

Відповіді:


119

Мені доведеться не погодитися з відповідями тут. Хоча Node буде працювати нормально, nginx, безумовно, буде швидшим при правильній настройці. nginx ефективно реалізований на мові C за аналогічним шаблоном (повернення до з'єднання лише тоді, коли це потрібно) з невеликим розміром пам'яті. Більше того, він підтримує syscall sendfile для обслуговування цих файлів так швидко, як ви можете отримати при обслуговуванні файлів, оскільки саме ядро ​​ОС виконує цю роботу.

На даний момент nginx став фактичним стандартом як зовнішній сервер. Ви можете використовувати його для його продуктивності при обслуговуванні статичних файлів, gzip, SSL і навіть балансування навантаження пізніше.

PS: Це передбачає, що файли дійсно "статичні", як і в стані спокою на диску під час запиту.


7
Лише незначна примітка: node.js також підтримує sendfile- але, схоже, вам потрібно написати якийсь код, див. Напр. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

Чому, окрім обслуговування статичного вмісту, ефективність Nginx краща, ніж просто оголення основного веб-сервера (Tomcat / Jetty / IIS тощо) у відкритому домені?
рафіян

1
Якщо запит зроблений до вашого додатку, цей запит не буде зроблений чарівно швидше, якщо спочатку його маршрутизувати через nginx (це може бути помітно швидше в найкращому випадку, коли nginx обробляє статичні CSS та js, gzip та SSL). Однак nginx також є одним з найкращих балансувальників навантаження програмного забезпечення, тому це може бути критично важливим, оскільки більшість серверів сумно відомі тим, що вони відключаються при помірно великих навантаженнях.
m33lky

Але ви можете асинхронно передавати файли в сервер за допомогою Node.js. Чи можете ви це зробити за допомогою NGINX?
Dragos C.

1
@lwansbrough принесіть ці показники до таблиці. Принаймні одна людина в цій темі проводила власні експерименти.
m33lky

75

Я швидко зробив ab -n 10000 -c 100для обслуговування статичного байта 1406 favicon.ico, порівнявши nginx, Express.js (статичне проміжне програмне забезпечення) та кластерний Express.js. Сподіваюся, це допоможе:

введіть тут опис зображення

На жаль, я не можу протестувати 1000 або навіть 10000 одночасних запитів, оскільки nginx на моїй машині почне видавати помилки.

EDIT : як запропонував artvolk, ось результати кластера + staticпроміжного програмного забезпечення (повільніше):

введіть тут опис зображення


Дякую, дуже корисно! Ви використовували це проміжне програмне забезпечення для favicon: senchalabs.org/connect/favicon.html або просто подавали його як статичний файл?
artvolk

@artvolk the favicon one :)
gremo

3
Ви встановили для тестів NODE_ENV = виробництво? Тому що це зробить неймовірну різницю завдяки кешуванню staticпроміжного програмного забезпечення, яке буде виконуватися у виробництві.
ruffrey

21
для тих з вас, хто не володіє італійською мовою, вісь x - це кількість запитів, а вісь Y - кількість мс, яку потрібно для обслуговування файлу. Мені довелося перекласти це в Google, оскільки я хотів переконатися, що не читаю дані неправильно. ці дані були неймовірно корисними, хоча я дуже ціную тест на тестування. врешті-решт дотримуватиметься nginx
JL Griffin

1
Чи було встановлено NODE_ENV = виробництво?
basickarl

11

Я по-різному трактую діаграми @ gremo. Мені здається, що і node, і nginx масштабують при однаковій кількості запитів (між 9-10 тис.). Звичайно, затримка у відповіді для nginx нижча на постійні 20 мс, але я не думаю, що користувачі обов'язково сприймуть цю різницю (якщо ваш додаток побудований добре). З огляду на фіксовану кількість машин, перш ніж перетворити машину вузлів на nginx, знадобиться досить значна кількість навантаження, враховуючи, що саме вузол буде більшою частиною навантаження. Одним з контрапунктів до цього є те, що ви вже присвятили машину nginx для балансування навантаження. Якщо це так, тоді ви можете також попросити його обслуговувати ваш статичний вміст.


1
"Звичайно, затримка у відповіді для nginx менша на постійні 20 мс, але я не думаю, що користувачі обов'язково сприймуть цю різницю"? Я серйозно сподіваюся, ви, хлопці, цього не робите. Є дані, що користувачі відчують різницю в 1 мс!
Navin

4
Потрібне цитування
Девід Берроус

9

У будь-якому випадку я б налаштував Nginx на кешування статичних файлів ... ви побачите там ВЕЛИЧЕЗНУ різницю. Потім, незалежно від того, обслуговуєте ви їх із вузла чи ні, ви в основному отримуєте однакову продуктивність і однакове полегшення навантаження у вашому додатку вузла.

Мені особисто не подобається ідея мого інтерфейсу Nginx, який обслуговує статичні активи в більшості випадків, саме в цьому

1) Проект тепер повинен бути на одній машині - або повинен бути розділений на активи (на машині nginx) та веб-програму (на декількох машинах для масштабування)

2) Конфігурація Nginx тепер повинна підтримувати розташування шляхів для статичних активів / перезавантаження при їх зміні.


0

На це каверзне запитання відповісти. Якби ви написали справді полегшений сервер вузлів, щоб просто обслуговувати статичні файли, він, швидше за все, працював би краще, ніж nginx, але це не так просто. ( Ось "еталон" порівнює файловий сервер nodejs та lighttpd - який за продуктивністю схожий на ngingx при обслуговуванні статичних файлів).

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

Якщо вас це не турбує, у більшості ситуацій вузол може добре обслуговувати статичні файли. Вузол піддається асинхронному коду, на який він також покладається, оскільки є однопотоковим, і будь-який блокувальний ввід / вивід може блокувати весь процес і погіршити продуктивність ваших додатків. Більш ймовірно, що ви пишете свій код неблокуючи, але якщо ви робите щось синхронно, це може спричинити блокування, що погіршить швидкість отримання іншими статичними файлами інших клієнтів. Найпростішим рішенням є не писати код блокування, але іноді це неможливо, або ви не завжди можете його застосувати.


9
Це все дурниці. Це питання стосується nginx, а не Apache. І nginx, і вузол використовують libev для свого циклу подій. Nginx буде в рази швидшим, ніж node. Один з них не має накладних витрат на віртуальну машину і написаний спеціально для виконання цієї операції у вашій файловій системі.
Еван Керролл

1
лібів був раннім вузлом. Libuv прийняв цю роль, щоб дозволити вузлу запускати міжплатформові платформи.
tsturzl

1
Я не бачу, як на це впливає асинхронний код. Продуктивність Node буде набагато гіршою, ніж у Nginx, і це, швидше за все, через блокування вводу-виводу, на яке ви зіткнетеся, коли у вас буде купа клієнтів, які просять вас читати файли з диска. Найкраща практика - завжди використовувати Nginx для статичних активів, щоб програма Node могла обробляти логіку програми. Ми могли б говорити про теоретичні сценарії, коли Node буде працювати ефективніше, але в реальному світі Nginx виграє в 9 миль із 10
wgp

-11

Я впевнений, що суто node.js може перевершити nginx у багатьох аспектах.

Всі сказали, що я маю залишитися NginX має вбудований кеш, тоді як node.js не постачається із заводським встановленням (ВИ ПОВИННІ СТРОИТИ ВЛАСНИЙ ФАЙЛ-КЕШ). Спеціальний кеш файлів перевершує nginx та будь-який інший сервер на ринку, оскільки це надзвичайно просто.

Також Nginx працює на декількох ядрах. Щоб використати весь потенціал Node, вам потрібно кластеризувати сервери вузлів. Якщо вам цікаво дізнатись, як тоді, будь ласка, pm.

Вам потрібно глибококопати, щоб досягти продуктивності нірвани з node, це єдина проблема. Зробивши пекло, так ... це б'є Nginx.


1
Вам потрібно навести деякі факти, оскільки я хотів би вірити у те, що Ви говорите, але для цього потрібні орієнтири, якщо вони базуються на реальному світі, чудово! але не крайні випадки
Стефан Рогін

5
Найцікавіше, що ця відповідь має стільки фактів, скільки обрана відповідь із найбільшою кількістю голосів. Я думаю, що люди просто віддають перевагу веб-серверу спереду, оскільки саме так їх навчили робити в [вставити будь-яку іншу технологію веб-додатків]. Це не гарна відповідь, але +1 із жалю.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.