Node.js сам или nginx интерфейс для обслуживания статических файлов?

Есть ли какой-либо бенчмарк или сравнение, которое выполняется быстрее: поместите nginx перед node и пусть он будет обслуживать статические файлы напрямую или использовать только node и обслуживать его статические файлы?

Решение nginx кажется более управляемым для меня, любых мыслей?

Ответ 1

Мне нужно будет не согласиться с ответами здесь. В то время как Node будет работать нормально, nginx будет определенно быстрее при правильной настройке. nginx эффективно реализуется в C по аналогичной схеме (возвращаясь к соединению только тогда, когда это необходимо) с небольшим объемом памяти. Кроме того, он поддерживает sendfile syscall, чтобы обслуживать те файлы, которые так же быстро, как вы можете получить в обслуживающих файлах, поскольку это ядро ​​ОС сам, выполняя эту работу.

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

P.S.: Это предполагает, что файлы действительно "статичны", как в состоянии покоя на диске во время запроса.

Ответ 2

Я сделал быстрый ab -n 10000 -c 100 для обслуживания статического 1406 байта favicon.ico, сравнивая nginx, Express.js(статическое промежуточное ПО) и кластерное Express.js. Надеюсь, это поможет:

enter image description here

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

РЕДАКТИРОВАТЬ: как предложено artvolk, вот результаты промежуточного ПО кластера + static (медленнее):

enter image description here

Ответ 3

В любом случае, я установил Nginx для кэширования статических файлов... вы увидите там огромную разницу. Затем, независимо от того, обслуживаете ли вы их из node или нет, вы в основном получаете такую ​​же производительность и одинаковый сброс нагрузки в своем приложении node.

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

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

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

Ответ 4

У меня есть другая интерпретация диаграмм @gremo. Мне кажется, что как node, так и nginx-шкала при одинаковом числе запросов (между 9-10k). Конечно, латентность в ответе для nginx ниже на 20 мс, но я не думаю, что пользователи обязательно воспримут эту разницу (если ваше приложение построено хорошо). Учитывая фиксированное количество машин, это потребовало бы значительной загрузки, прежде чем я преобразовал бы машину node в nginx, учитывая, что node - это где большая часть загрузки будет иметь место в первую очередь. Один контрапункт к этому - если вы уже посвятили машину nginx для балансировки нагрузки. Если это так, вы можете также использовать его для статического контента.

Ответ 5

Это сложный вопрос. Если вы написали действительно легкий node сервер, который будет просто обслуживать статические файлы, он, скорее всего, будет работать лучше, чем nginx, но это не так просто. (Здесь "сравнительный тест" , сравнивающий файловый сервер nodejs и lighttpd, который похож по производительности на ngingx при обслуживании статических файлов).

Производительность в отношении обслуживания статических файлов часто сводится к тому, что работает не только веб-сервер. Если вы хотите, чтобы максимальная производительность была возможной, вы будете использовать CDN для обслуживания ваших файлов, чтобы уменьшить латентность для конечных пользователей, и извлечь выгоду из краевого кэширования.

Если вы не беспокоитесь об этом, node может использовать статические файлы в большинстве случаев. node поддается асинхронному коду, на который он также опирается, поскольку однопоточность и блокирование ввода-вывода могут блокировать весь процесс и ухудшать производительность ваших приложений. Скорее всего, вы пишете свой код неблокирующимся способом, но если вы делаете что-либо синхронно, вы можете вызвать блокировку, которая ухудшит скорость выполнения другими клиентами своих статических файлов. Простое решение - не писать блокирующий код, но иногда это не так, или вы не можете всегда его применять.

Ответ 6

Я уверен, что чисто node.js может превзойти nginx во многом.

Все сказали, что я должен остаться. NginX имеет встроенный кеш, тогда как node.js не поставляется с ним factory (вы должны создать свой собственный файл CACHE). Пользовательский кэш файлов превосходит nginx и любой другой сервер на рынке, поскольку он очень прост.

Также Nginx работает на нескольких ядрах. Чтобы использовать весь потенциал Node, вам необходимо кластерные Node серверы. Если вам интересно узнать, как это сделать, пожалуйста, пожалуйста.

Для достижения производительности нирваны с помощью node вам нужно глубокое копирование, это единственная проблема. Когда-то делал ад, да... это бьет Nginx.