Почему 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, не стоит сразу считать его частью технологии. Очень часто это всего лишь договорённость между программами о том, где искать друг друга.
А договорённость, в отличие от ограничения, всегда можно изменить.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.