Что обычно указывается вторым параметром (host) в методе createServer модуля http в режиме продакшен?
Типичный "Hello world" для модуля http:
import HTTP from "http";
const HOST: string = "123.4.5.6";
const PORT: number= 1337;
HTTP.createServer(requestListener).listen(PORT, HOST, (): void => {
console.log({
title: "Сервер запущен",
description: `Ожидание запросов на хост:${HOST}, порт: ${PORT}...`
});
});
А что у нас будет в переменной HOST на продакшене, а не в режиме локальной разработки? Я понимаю, что мы это значение возьмём откуда-то извне (например из .env файла), но будет ли оно содержать также, как и в режиме локальной разработки, один лишь API-адрес? Имеет ли отношение к HOST доменное имя?
Ответы (1 шт):
Разработчики для запуска на своем компьютере указывают обычно localhost (или 127.0.0.1). Это адрес привязанный к особому сетевому интерфейсу, который доступен только с этого же хоста.
При запуске в проде указывают IP адрес, который привязан к внешнему сетевому интерфейсу, откуда будут поступать запросы. Если это реальная машина, то это может быть сетевой интерфейс ethernet. Если это виртуальная машина, то сетевой интерфейс эмулируемый виртуальной машиной.
Важно, чтоб через этот интерфейс был доступ из сети из которой будут приходить запросы. Очень редко такой сервер с приложением имеет реальный IP и доступен напрямую из интернет. Т.е. обычно он подключен к внутренней сети (реальной или виртуальной), а запросы к нему попадают с другого сервера, к которому есть доступ из интернет в том числе по доменному имени. В роли такого сервера может выступать haproxy, nginx или сервис типа ELB. Такой сервер получив запрос отдает его на обработку приложению уже по внутренней локальной сети и получив ответ от приложения отдает его клиенту.
То есть, когда приложение запускается, то HOST должен быть таким, чтоб к нему мог достучатся по внутренней сети этот прокси сервер. Простой способ это сделать, это слушать вообще на всех сетевых интерфейсах, т.е. указать "0.0.0.0" в качестве хоста, но с точки зрения безопасности лучше указывать конкретный ip адрес конкретного сетевого интерфейса.