Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Jak zmienić port nasłuchu klastra PostgreSQL

W skrócie

  • Chcesz, żeby PostgreSQL nasłuchiwał na innym porcie niż domyślne 5432 - bo port jest zajęty, bo masz dwa klastry na jednym serwerze, albo z powodu polityki bezpieczeństwa.
  • Zmiana jednej liczby wydaje się prosta, ale port to parametr wczytywany tylko przy starcie, a klienci dalej łączą się na 5432 i dostają "connection refused".
  • Ustawiamy parametr port, restartujemy klaster (nie reload), a następnie aktualizujemy sposób łączenia klientów i regułę zapory.

Port 5432 to domyślna wizytówka PostgreSQL, ale nierzadko trzeba go zmienić: gdy port jest już zajęty przez inny proces, gdy stawiasz drugą instancję na tej samej maszynie, albo gdy zespół bezpieczeństwa prosi o odejście od domyślnej wartości. Sama zmiana to jedna linijka w konfiguracji - ale diabeł tkwi w tym, że port należy do parametrów, które zaczynają obowiązywać dopiero po pełnym restarcie, a nie po zwykłym przeładowaniu.

Jak to wygląda w praktyce

Zmieniasz wartość port w postgresql.conf, wykonujesz SELECT pg_reload_conf(); i... nic. SHOW port; nadal pokazuje starą wartość, a klienci łączą się jak wcześniej. Albo scenariusz odwrotny: zmieniłeś port, zrestartowałeś klaster - i teraz aplikacja zwraca "could not connect to server: Connection refused", bo w connection stringu wciąż ma 5432. Na maszynie z dwoma klastrami dochodzi jeszcze kolizja: drugi klaster nie wstaje, bo próbuje zająć port już używany przez pierwszy, a log startu wprost mówi "could not create any TCP/IP sockets" albo "address already in use".

Dlaczego tak się dzieje

Numer portu to parametr o kontekście postmaster - taki, który PostgreSQL czyta jednorazowo przy uruchamianiu głównego procesu i nie potrafi zmienić w locie. Gniazdo nasłuchujące zakłada się na starcie, więc żeby przełączyć port, serwer musi zamknąć stare gniazdo i otworzyć nowe, co wymaga pełnego restartu. Zwykły reload przeładowuje tylko parametry z kontekstem sighup (jak work_mem czy reguły pg_hba.conf) i port po prostu ignoruje. Druga część kłopotu leży poza serwerem: zmiana portu nic nie mówi klientom. Sterowniki i narzędzia domyślnie celują w 5432, więc dopóki nie zaktualizujesz connection stringów, zmiennej PGPORT albo pliku usługi, będą pukać w port, na którym już nikogo nie ma. Do tego zapora sieciowa zwykle przepuszcza tylko 5432 - nowy port trzeba jej jawnie otworzyć.

Jak to rozwiązać krok po kroku

  1. Sprawdź, czy docelowy port jest wolny, zanim go ustawisz: ss -ltnp | grep :5433 (Linux). Pusty wynik oznacza, że port jest dostępny.
  2. Ustaw parametr. Możesz edytować postgresql.conf (linia port = 5433) albo zrobić to poleceniem SQL: ALTER SYSTEM SET port = 5433;, które zapisze wartość do postgresql.auto.conf.
  3. Na Debianie/Ubuntu z zarządzaniem klastrami pamiętaj, że narzędzia startowe czytają port także z /etc/postgresql/16/main/postgresql.conf - upewnij się, że zmieniasz plik faktycznie używany (potwierdzisz go przez SHOW config_file;).
  4. Zrestartuj klaster, bo sam reload nie wystarczy: systemctl restart postgresql@16-main (Debian) albo systemctl restart postgresql (Red Hat). To moment krótkiej przerwy w dostępności bazy.
  5. Otwórz nowy port w zaporze i w razie potrzeby zamknij stary, na przykład dla firewalld: firewall-cmd --add-port=5433/tcp --permanent i firewall-cmd --reload.
  6. Zaktualizuj klientów: connection stringi aplikacji, pliki ~/.pg_service.conf, ewentualnie zmienną PGPORT. Przy łączeniu z psql podawaj port jawnie: psql -h serwer -p 5433 -U uzytkownik baza.

Jak sprawdzić, że zadziałało

Po restarcie połącz się i wykonaj SHOW port; - musi zwrócić nową wartość. Z poziomu systemu potwierdź, że serwer nasłuchuje pod właściwym numerem: ss -ltnp | grep postgres powinno pokazać proces na porcie 5433 i brak nasłuchu na 5432. Dostępność sieciową sprawdzisz najprościej udanym logowaniem: psql -h 127.0.0.1 -p 5433 -U postgres. Jeśli łączenie na nowy port działa lokalnie, ale nie ze zdalnej maszyny, przyczyną jest niemal zawsze zapora - zweryfikuj regułę dla nowego portu. Warto też upewnić się, że przy dwóch klastrach każdy trzyma się swojego portu: SHOW port; uruchomione w każdym z nich powinno dawać różne wartości, a w logach startu nie może być komunikatu "address already in use".

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego po zmianie portu i przeładowaniu konfiguracji nic się nie dzieje?
Bo port to parametr o kontekście postmaster, wczytywany tylko przy starcie serwera. Zwykły reload go ignoruje - żeby zmienić port, trzeba wykonać pełny restart klastra, na przykład systemctl restart postgresql.
Po zmianie portu aplikacja zwraca connection refused - co zrobić?
Zmiana portu nie informuje klientów, którzy domyślnie celują w 5432. Zaktualizuj connection stringi aplikacji, pliki usług lub zmienną PGPORT, a przy łączeniu przez psql podawaj port jawnie flagą -p. Pamiętaj też o otwarciu nowego portu w zaporze sieciowej.
Czy port można zmienić poleceniem SQL?
Tak. ALTER SYSTEM SET port = 5433; zapisze wartość do postgresql.auto.conf. Zmiana i tak zacznie obowiązywać dopiero po restarcie klastra. Na Debianie sprawdź jeszcze, czy narzędzia startowe nie czytają portu z pliku w /etc/postgresql - potwierdzisz go przez SHOW config_file;.
Jak sprawdzić, że serwer nasłuchuje na nowym porcie?
Po restarcie wykonaj SHOW port; - powinno zwrócić nową wartość. Z poziomu systemu potwierdź to poleceniem ss -ltnp | grep postgres, które pokaże, na którym porcie proces faktycznie nasłuchuje. Ostatecznym testem jest udane połączenie psql na nowy port.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...