Да, это сервер.
Веб-приложение node.js - это полноценный веб-сервер, такой же, как Nginx или Apache.
Вы действительно можете обслуживать свое приложение node.js без использования какого-либо другого веб-сервера. Просто измените свой код на:
app = express();
http.createServer(app).listen(80);
Действительно, некоторые проекты используют node.js в качестве интерфейса балансировки нагрузки для других серверов (включая Apache).
Обратите внимание, что node.js - не единственный стек разработки, который это делает. Фреймворки веб-разработки на Go, Java и Swift также делают это.
Зачем?
Вначале была CGI. CGI был в порядке и работал нормально. Apache получит запрос, обнаружит, что URL-адрес должен запускать приложение CGI, выполнить это приложение CGI и передать данные в качестве переменных среды, прочитать стандартный вывод и передать данные обратно в браузер.
Проблема в том, что он медленный. Ничего страшного, когда приложение CGI было небольшой статически скомпилированной программой на языке C, но группу небольших статически скомпилированных программ на языке C стало трудно поддерживать. Итак, люди начали писать на скриптовых языках. Затем это стало трудно поддерживать, и люди начали разрабатывать объектно-ориентированные среды MVC. Теперь у нас начались проблемы - КАЖДЫЙ ЗАПРОС должен скомпилировать все эти классы и создать все эти объекты только для обслуживания некоторого HTML, даже если нет ничего динамического для обслуживания (поскольку фреймворк должен выяснить, что нет ничего динамического для обслуживания).
Что, если нам не нужно создавать все эти объекты при каждом запросе?
Так думали люди. И из попытки решить эту проблему возникло несколько стратегий. Одним из первых было внедрение интерпретаторов непосредственно в веб-серверы, как mod_php
в Apache. Скомпилированные классы и объекты могут храниться в глобальных переменных и, следовательно, кэшироваться. Другая стратегия заключалась в предварительной компиляции. И еще одна стратегия заключалась в том, чтобы запустить приложение как обычный серверный процесс и взаимодействовать с веб-сервером, используя специальный протокол, такой как FastCGI.
Затем некоторые разработчики начали просто использовать HTTP в качестве протокола приложения-> сервера. По сути, приложение также является HTTP-сервером. Преимущество этого заключается в том, что вам не нужно реализовывать какой-либо новый, возможно, ошибочный, возможно, не протестированный протокол, и вы можете отлаживать свое приложение напрямую, используя веб-браузер (или, как правило, curl
). И вам не нужен модифицированный веб-сервер для поддержки вашего приложения, просто любой веб-сервер, который может выполнять обратное проксирование или перенаправления.
Зачем использовать Apache / Nginx?
Когда вы обслуживаете приложение node.js, обратите внимание, что вы являетесь автором собственного веб-сервера. Любая потенциальная ошибка в вашем приложении - это ошибка, которую можно напрямую использовать в Интернете. Некоторым это (справедливо) не нравится.
Добавление слоя Apache или Nginx перед вашим приложением node.js означает, что у вас есть проверенное в боях, защищенное программное обеспечение в реальном времени в Интернете в качестве интерфейса для вашего приложения. Это добавляет крошечную задержку (обратное проксирование), но большинство считает, что оно того стоит.
Раньше это был стандартный совет на заре создания node.js. Но в наши дни также существуют сайты и веб-сервисы, которые предоставляют node.js напрямую в Интернет. В http.Server
настоящее время модуль довольно хорошо протестирован в Интернете, чтобы ему можно было доверять.
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
Нет, это неверно