Почему PostgreSQL использует порт 5432?

mr. Cooper 5 дней назад Веб-разработка
Почему PostgreSQL использует порт 5432?

Если открыть настройки подключения к PostgreSQL, почти наверняка там найдётся число 5432.

Например:

//text

localhost:5432

Для человека, который только начинает работать с базами данных, это выглядит немного странно. У HTTP есть 80, у HTTPS - 443, у SSH - 22. С этими числами всё более-менее понятно: они давно стали привычными.

А откуда взялся 5432?

Я когда-то тоже воспринимал его просто как часть PostgreSQL. Будто разработчики базы выбрали специальное число, связанное с устройством самой СУБД.

На деле всё интереснее. И одновременно гораздо прозаичнее.

PostgreSQL не «привязан» к 5432

Начать стоит с вещи, которая сразу снимает половину вопросов.

5432 не является обязательным портом PostgreSQL.

Сервер можно запустить, например, на 5433:

//conf

port = 5433

После этого клиенту просто нужно указать новый порт:

//bash

psql -h localhost -p 5433

То же самое происходит с приложением. Если Laravel, Node.js или любой другой клиент ищет базу на 5432, а PostgreSQL работает на 5433, соединения не будет.

Сама база при этом совершенно нормально работает.

Получается довольно простая вещь: 5432 - это договорённость, а не закон природы.

В документации PostgreSQL этот порт называется стандартным для протокола PostgreSQL, а IANA зарегистрировала 5432 как порт PostgreSQL. При этом документация отдельно указывает, что использовать можно и другой непривилегированный порт.

Но зачем вообще базе нужен порт?

Представим обычный сервер.

На нём может одновременно работать несколько программ:

//text

22      SSH
80      HTTP
443     HTTPS
5432    PostgreSQL

У всех один и тот же IP-адрес сервера, но разные порты.

Когда приложение обращается к:

//text

192.168.1.20:5432

оно фактически говорит операционной системе: мне нужен сервис, который принимает соединения на этом порту.

PostgreSQL слушает 5432 и получает соединение.

Поэтому в строке:

//text

postgresql://user:password@localhost:5432/shop

число 5432 вообще не связано с названием базы shop, пользователем или SQL.

Это просто адрес сетевой точки, где приложение ожидает увидеть PostgreSQL.

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

Вот тут как раз начинается место, где легко придумать красивую историю.

В интернете можно встретить разные версии происхождения числа 5432. Иногда ему пытаются приписать скрытый смысл или связать отдельные цифры с названием PostgreSQL.

Проблема в том, что официальная документация PostgreSQL такой расшифровки не даёт.

Поэтому честный ответ выглядит немного скучно:

5432 исторически стал стандартным портом PostgreSQL.

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

Это примерно как с другими стандартными портами. Нам не обязательно знать, почему когда-то для конкретного сервиса выбрали именно такой номер, чтобы понимать, зачем он используется сейчас.

Важнее другое: когда клиент PostgreSQL не получает отдельный номер порта, он ожидает стандартное значение. В текущей документации PostgreSQL указано, что стандартный порт обычно равен 5432; это значение задаётся при сборке, а изменить его можно через конфигурацию.

Откуда тогда берётся 5433?

Это уже знакомая ситуация для разработчиков.

Допустим, на компьютере уже запущен PostgreSQL:

//text

PostgreSQL → 5432

И вы хотите поднять ещё один экземпляр.

Например, для тестирования другой версии PostgreSQL.

Второй сервер не сможет занять тот же адрес и порт. Поэтому ему назначают другой:

//text

PostgreSQL #1 → 5432
PostgreSQL #2 → 5433

И всё.

Никакой новой разновидности PostgreSQL под названием «5433» не существует.

Это просто второй экземпляр, который слушает другой порт.

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

В Docker это становится особенно заметно

С Docker легко увидеть разницу между портом PostgreSQL и портом, через который мы обращаемся к контейнеру.

Например:

//yaml

ports:
  - "5432:5432"

Здесь PostgreSQL внутри контейнера слушает 5432, и наружу мы тоже публикуем 5432.

Но можно написать:

//yaml

ports:
  - "15432:5432"

Теперь с компьютера разработчика база доступна через:

//text

localhost:15432

А внутри контейнера PostgreSQL по-прежнему работает на:

//text

5432

Это хороший пример того, почему не стоит воспринимать 5432 как нечто встроенное в саму базу.

Порт снаружи и порт, на котором работает PostgreSQL внутри контейнера, - не обязательно одно и то же.

## Можно ли поставить вообще любой порт?

В разумных пределах - да.

Например:

//conf

port = 15432

После изменения PostgreSQL будет ждать подключения уже там.

Но есть один нюанс, о котором легко забыть.

Изменить порт на сервере недостаточно. Клиенты тоже должны узнать об изменении.

Если приложение настроено так:

//env

DB_HOST=127.0.0.1
DB_PORT=5432

а PostgreSQL перенесли на 15432, приложение продолжит стучаться в старое место.

Результат обычно выглядит знакомо:

//text

connection refused

И в этот момент новичок может начать проверять пароль, пользователя, права доступа или саму базу.

Хотя PostgreSQL просто слушает другой порт.

Нужно ли менять 5432 на сервере?

Обычно - нет.

Сам по себе нестандартный порт не делает PostgreSQL автоматически безопаснее. Если сервер доступен из интернета, гораздо важнее правильно настроить listen_addresses, правила доступа и аутентификацию.

Поэтому менять 5432 только ради того, чтобы «спрятать PostgreSQL», - сомнительная идея.

Нестандартный порт может быть удобен по организационным причинам: например, когда на сервере несколько экземпляров PostgreSQL или конкретная инфраструктура требует определённой схемы портов.

А если обычному приложению нужна одна база, стандартный 5432 зачастую просто удобнее.

Так что же означает 5432?

Если отбросить все легенды, ответ довольно короткий.

5432 - это привычный стандартный порт PostgreSQL.

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

При этом PostgreSQL совершенно не запрещает использовать другой порт.

Поэтому:

//text

5432

не означает:

«Без этого числа PostgreSQL работать не может».

Скорее это означает:

«Если вы ничего не меняли, попробуйте сначала здесь».

И именно поэтому число 5432 так часто встречается в .env, Docker Compose, строках подключения, настройках IDE и командах psql.

Самая полезная мысль здесь даже не про PostgreSQL.

Когда вы видите в конфигурации какой-нибудь номер вроде 5432, не стоит сразу считать его частью технологии. Очень часто это всего лишь договорённость между программами о том, где искать друг друга.

А договорённость, в отличие от ограничения, всегда можно изменить.

Комментарии

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

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

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