Почему Node.js часто запускается на 3000?

mr. Cooper 1 неделю назад Технологии
Почему Node.js часто запускается на 3000?

Если вы хотя бы раз запускали проект на Node.js, то наверняка видели знакомый адрес: http://localhost:3000. Особенно часто он появляется в учебниках, примерах и проектах на Express, Next.js и других инструментах вокруг JavaScript.

Возникает вполне логичный вопрос: почему именно 3000? Почему не 8080, не 5000 и не какой-нибудь другой порт?

Самое интересное здесь в том, что Node.js не считает порт 3000 каким-то особенным. Он не встроен в Node.js как обязательный и не имеет специального значения для JavaScript.

Тогда откуда он вообще взялся?

Node.js не требует порт 3000

Это легко проверить на обычном HTTP-сервере:

//js

const http = require('http');

const server = http.createServer((req, res) => {
    res.end('Hello');
});

server.listen(5000);

Приложение запустится на 5000. Если поставить 8080, будет работать на 8080. С 3000 происходит то же самое.

Node.js здесь вообще ничего не выбирает. Приложение передаёт операционной системе номер порта, на котором хочет принимать соединения.

Поэтому 3000 - не «порт Node.js». Это просто число, которое очень часто встречается в проектах на JavaScript.

Почему именно 3000?

Одной технической причины здесь нет.

Для локального веб-приложения нужен какой-нибудь порт. Разработчики стали использовать 3000, это значение появлялось в примерах и документации, его подхватывали новые проекты.

Со временем номер стал привычным.

Это хорошо заметно на простом примере. Человек создаёт новый проект, запускает его и получает:

//text

http://localhost:3000

Потом начинает свой следующий проект и вполне естественно оставляет тот же порт.

Ничего не нужно придумывать заново.

Так появляется договорённость, которой формально никто не утверждал.

Почему не 80?

80 кажется более логичным вариантом, потому что это стандартный порт HTTP.

Но для локальной разработки он не всегда удобен. На Unix-подобных системах для портов ниже 1024 обычно нужны повышенные права. К тому же 80 вполне может быть уже занят Nginx, Apache или другим веб-сервисом.

С 3000 проще.

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

Но это именно вопрос удобства. Node.js совершенно не мешает выбрать другой номер.

Откуда берутся 5000 и 8080?

По той же причине.

В разных проектах можно встретить:

//text

localhost:3000
localhost:5000
localhost:8000
localhost:8080

Ни одно из этих значений не является обязательным для Node.js.

Более того, на одном компьютере они могут использоваться одновременно. Например, интерфейс работает на 3000, API - на 5000, а ещё один локальный сервис - на 8080.

Проблема появляется только тогда, когда два процесса пытаются слушать один и тот же порт.

В таком случае Node.js обычно сообщает об ошибке:

//text

EADDRINUSE

То есть адрес уже используется.

Самый простой вариант - освободить порт или запустить приложение на другом:

//js

server.listen(3001);

Поэтому порт часто выносят в PORT

В нормальном проекте номер порта не обязательно держать непосредственно в коде.

Например:

//js

const PORT = process.env.PORT || 3000;

server.listen(PORT);

Теперь приложение сначала проверяет переменную окружения PORT. Если она задана, используется её значение. Если нет - берётся 3000.

На компьютере разработчика это может быть:

//text

localhost:3000

а на сервере приложение вполне может работать на 5000.

Такой вариант особенно удобен, когда на одной машине работает несколько сервисов.

А при чём здесь Nginx?

Здесь становится понятно, почему номер 3000 вообще не обязан быть виден пользователю.

Например, приложение может работать так:

//text

Браузер
   ↓
HTTPS :443
   ↓
Nginx
   ↓
Node.js :3000

Пользователь открывает обычный адрес сайта:

//text

https://example.com

Nginx принимает запрос и передаёт его Node.js-приложению, которое слушает 3000.

В адресной строке браузера при этом никакого :3000 нет.

Получается, что 3000 может быть исключительно внутренней деталью сервера.

Что на самом деле означает localhost:3000?

Если разобрать адрес по частям:

//text

http://localhost:3000

то localhost означает компьютер, на котором запущен браузер или приложение, а 3000 - порт, на котором конкретный сервис принимает соединения.

Само число ничего не говорит о Node.js.

Если завтра разработчик поменяет его на 4000, приложение от этого не перестанет быть Node.js-приложением.

И наоборот: сервер на 3000 совершенно необязательно написан на Node.js.

На этом порту может работать программа на Python, Go, Java или любом другом языке.

Вот почему связывать 3000 непосредственно с Node.js неправильно.

Почему тогда кажется, что это стандарт?

Потому что мы постоянно видим одно и то же.

Документация показывает 3000.

Шаблон проекта использует 3000.

Разработчик копирует шаблон.

Следующий разработчик делает то же самое.

Через некоторое время число уже настолько привычно, что его начинают воспринимать как часть самой технологии.

Но между «часто используется» и «обязательно используется» есть большая разница.

С 3000 как раз такой случай.

Так почему Node.js часто запускается на 3000?

Потому что 3000 стал удобной и привычной договорённостью для локальной разработки.

Node.js не выбирал этот порт для себя. JavaScript тоже не имеет к нему какой-то специальной привязки.

Если в проекте стоит:

//js

server.listen(3000);

это всего лишь решение автора проекта.

Можно поставить 5000:

//js

server.listen(5000);

или передать номер через PORT.

И приложение будет работать точно так же.

Пожалуй, в этом и заключается самое интересное: 3000 выглядит как технический стандарт, хотя на самом деле это в первую очередь результат привычки.

Разработчики просто много раз выбирали одно и то же число - и со временем оно стало узнаваемым.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи