Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Jak zmienić port nasłuchu klastra PostgreSQL
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.
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".
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ć.
ss -ltnp | grep :5433 (Linux). Pusty wynik oznacza, że port jest dostępny.postgresql.conf (linia port = 5433) albo zrobić to poleceniem SQL: ALTER SYSTEM SET port = 5433;, które zapisze wartość do postgresql.auto.conf./etc/postgresql/16/main/postgresql.conf - upewnij się, że zmieniasz plik faktycznie używany (potwierdzisz go przez SHOW config_file;).systemctl restart postgresql@16-main (Debian) albo systemctl restart postgresql (Red Hat). To moment krótkiej przerwy w dostępności bazy.firewall-cmd --add-port=5433/tcp --permanent i firewall-cmd --reload.~/.pg_service.conf, ewentualnie zmienną PGPORT. Przy łączeniu z psql podawaj port jawnie: psql -h serwer -p 5433 -U uzytkownik baza.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

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

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
Komentarze (0)
Brak komentarzy...