본문 바로가기

DB관련

postgresql 관련 정리(connection refused)

728x90

rhel의 dnf install을 통해 설치한 13 버전의 db를 같은 방법으로 17버전으로 업그레이드를 할 때 GPT가 잘 알려줬다.

문제는 sudo systemctl start postgresql-17 로 분명 켰는데 WAS 에서 DB 접근 시에 connection refused 가 나와서

GPT의 도움을 받으니 다음과 같이 말해주더라. 

 

=====

그럼 이제는 설정값 자체보다 “실제로 어느 설정 파일/서비스를 보고 있는지” 를 의심해야 해.

지금 같은 경우는 보통 아래 5개 중 하나야.

  1. postgresql.conf 를 수정했지만 다른 경로의 실제 설정 파일을 보고 있음
  2. 설정 바꿨지만 재기동이 안 됐거나 다른 인스턴스가 떠 있음
  3. listen_addresses 는 맞는데 방화벽/SELinux 가 막음
  4. pg_hba.conf 문제가 아니라, 애초에 TCP listen 자체가 여전히 localhost만 열려 있음
  5. JBoss가 접속하는 대상 IP가 내가 생각한 DB IP와 다름

지금 로그상 제일 중요한 건 이거야:

 
127.0.0.1:5432 LISTEN
::1:5432 LISTEN
 

이건 무조건 아직 외부 IP로 안 열려 있는 상태야.
즉, JBoss 설정 문제가 아니라 DB 쪽 listen 상태가 여전히 안 바뀐 것부터 해결해야 해.


1단계: PostgreSQL이 “진짜로” 어떤 설정 파일을 쓰는지 확인

DB 서버 192.168.56.110 에서 postgres 계정 또는 root로 아래 실행:

 
sudo -u postgres psql -c "show config_file;"
sudo -u postgres psql -c "show hba_file;"
sudo -u postgres psql -c "show data_directory;"
sudo -u postgres psql -c "show listen_addresses;"
sudo -u postgres psql -c "show port;"

 

여기서 봐야 하는 것:

  • config_file 경로
  • hba_file 경로
  • 현재 인식 중인 listen_addresses

중요

네가 수정한 파일 경로와
show config_file; 결과가 다르면
엉뚱한 파일을 수정한 것이야.


2단계: 서비스가 진짜 어떤 프로세스를 띄우는지 확인

DB 서버에서:

ps -ef | grep postgres
systemctl status postgresql-17 -l
systemctl cat postgresql-17
 

그리고 실제 리슨 상태 확인:

 
ss -lntp | grep 5432
 

정상이면 이런 식이어야 해:

 
LISTEN 0 ... 0.0.0.0:5432

 

또는

LISTEN 0 ... 192.168.56.110:5432
 

그런데 지금처럼 127.0.0.1:5432 만 보이면
설정 적용이 안 된 거야.


3단계: 설정 파일을 정확히 수정

show config_file; 로 나온 그 파일을 열어서 확인:

 
vi /실제/경로/postgresql.conf
 

이 줄 찾아서:

 
#listen_addresses = 'localhost'
 

또는

 
listen_addresses = 'localhost'
 

이걸 아래처럼 바꿔:

 
listen_addresses = '*'
 

포트도 같이 확인:

 
port = 5432
 

저장 후, show hba_file; 로 나온 파일도 수정:

 
vi /실제/경로/pg_hba.conf
 

예시:

 
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.56.101/32 scram-sha-256
 

대역 허용이면:

 
host all all 192.168.56.0/24 scram-sha-256
 

4단계: 적용 방법을 확실히

재기동:

systemctl restart postgresql-17

직후 바로 확인:

systemctl status postgresql-17 -l
ss -lntp | grep 5432
sudo -u postgres psql -c "show listen_addresses;"

여기서도 여전히 localhost 면
설정 파일이 다른 거거나 서비스가 다른 것

5단계: 서버 로컬에서 자기 IP로 접속 테스트

DB 서버 192.168.56.110 본인에서 이 테스트가 중요해.

 
telnet 192.168.56.110 5432

또는

psql -h 192.168.56.110 -U postgres -d postgres

해석

  • 여기서도 Connection refused 면
    외부 서버 문제가 아니라 DB 서버가 자기 IP에도 안 열려 있는 상태
  • 여기서 성공하고 원격에서만 실패면
    그때는 방화벽/SELinux 쪽을 보면 돼

6단계: firewalld 확인

DB 서버에서:

systemctl status firewalld
firewall-cmd --list-all
firewall-cmd --list-ports

5432 허용 안 되어 있으면:


firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
 

7단계: SELinux 확인

DB 서버에서:

 
getenforce
 

Enforcing 이면 일단 테스트로 잠깐 내려서 확인:

 
setenforce 0
 

그다음 원격에서 다시:

 
telnet 192.168.56.110 5432
 
  • 이때 되면 SELinux 영향 가능성 있음
  • 그래도 안 되면 SELinux 아님

테스트 끝나면 다시:

 
setenforce 1
 

8단계: PostgreSQL 로그 확인

재기동 직후 로그를 봐야 해.

 
journalctl -u postgresql-17 -n 100 --no-pager

 

 

참고로 내 경우에는 1번에서 해결되었다.

13버전에서 쓰던 conf 파일이 17에도 먹힐 줄 알았는데 별도의 경로에서 동작하고 있더라..