Как работает веб-сервер и node js в связке? Зачем нужен Nginx?
Привет! Я только начал погружаться в мир бэкэнда, и иногда не совсем понимаю что и зачем нужно.
В общем, я решил сделать простую доску объявлений, у меня имеется два сервера на Node.Js, один отдает статику, другой - api который формирует запросы к базе. Но я не давно узнал о такой штуке как Nginx (ну и вообще о других веб-серверах). И теперь у меня возникла дилемма, я вообще запутался, и не понимаю как правильно, и что для чего нужно.
Как я понял, Nginx и Node Js могут работать в связке, но тогда кто за что отвечает, если маршрутизация выполняется с помощью React, все необходимые файлы отдает Node, запросы так же делает Node, для чего тогда вообще нужен веб-сервер на Nginx, и какую задачу он будет выполнять?
Зачем вообще нужен Nginx, Apache и т.п. если всю серверную часть можно организовать на node, или на любом другом языке и фреймворке?
Алексей Уколов
@alexey-m-ukolov Куратор тега Веб-разработка
Самое простое - nginx отдаёт статику. На больших объёмах делать это через Ноду неэффективно.
Посложнее - nginx позволяет управлять ходом запроса. Например, редиректить на https.
Ещё сложнее - можно настроить nginx, чтобы он умно балансировал запросы между несколькими бэкендами и автоматом блокировал слишком частые попытки подключения.
Nginx очень хорошо в промышленных масштабах делает определённую часть работы, связанной с http-запросом, поэтому ему эту часть работы и делегируют.
Я nginx юзаю по той причине, что на одном сервере крутятся несколько приложений, с его помощью удобно объединить их все "под одной крышей", не арендуя для каждого из них отдельный инстанс. В ситуации с дефицитом IPv4-адресов это как-то расточительно, а так - каждое приложение слушает отдельный порт, nginx слушает 80 и 443 и проксирует все запросы по имени домена на них.
Да и гораздо проще всю работу по обеспечению общения клиентов с сервером скинуть на nginx - не надо в каждом приложении отдельно делать логирование запросов, работу по получению и продлению SSL-сертификатов, можно сосредоточиться на решении конкретной проблемы.