시스템

리눅스에서 "Connection Refused" 에러 원인 진단과 해결 방법

JihwanGo 2025. 9. 10. 15:55
반응형

서버 관리자들이 자주 마주치는 기초적이면서도 골치 아픈 문제 중 하나, 바로 "Connection Refused" 에러예요. 현업에서 서버 접속이나 애플리케이션 실행 시 "뭐야, 왜 안 돼?" 하며 당황하는 순간이죠. 😅 이 에러의 원인과 즉시 적용 가능한 팁을 정리해볼게요. 초보자부터 현업 엔지니어까지, 누구나 겪을 수 있는 문제라서 꼭 알아두세요! 🚀

왜 "Connection Refused"가 현장에서 자주 터질까?

"Connection Refused"는 클라이언트가 서버에 TCP 연결을 시도했지만, 서버가 연결을 거부할 때 발생해요. 2025년 들어 AI 워크로드, 컨테이너(Kubernetes), 클라우드 환경이 늘면서 설정 실수나 네트워크 이슈로 이 에러가 더 자주 보입니다. 특히 개발자나 네트워크 관리자가 새로운 서비스 배포하거나 테스트 환경 세팅할 때 자주 마주쳐요. 간단한 설정 미스로 생기는 경우가 많아 빠르게 진단하고 고치면 바로 해결됩니다! 😎

주요 원인 분석

이 에러는 몇 가지 기초적인 원인에서 비롯돼요. 현장에서 가장 흔한 원인들부터 보죠:

  1. 서비스가 실행되지 않음: 대상 포트(예: 80, 443)에서 애플리케이션이 안 돌아가고 있어요. 예를 들어, Nginx나 Spring Boot 앱이 꺼져 있으면 바로 이 에러.
  2. 방화벽/iptables 차단: 리눅스 방화벽이나 클라우드 보안 그룹이 포트를 막고 있음. 초보자가 설정 잊기 쉬움.
  3. 잘못된 IP/포트: 클라이언트가 잘못된 IP나 포트로 접속 시도. 로컬호스트(127.0.0.1) vs 외부 IP 혼동이 흔함.
  4. 네트워크 문제: 서버가 다운됐거나, 네트워크 인터페이스 설정 오류, 또는 DNS 문제로 연결 실패.
  5. 리소스 부족: 서버의 파일 디스크립터나 메모리가 부족해 연결을 거부. AI 앱 배포 시 자주 발생.

문제 진단 방법: 5분 안에 원인 찾기!

기초적인 문제인 만큼, 진단도 간단한 리눅스 명령어로 빠르게 가능해요. 단계별로 따라 해보세요.

  1. 서비스 상태 확인: 대상 서비스가 돌아가는지 확인.
    sudo systemctl status nginx
     - 또는 포트 확인: sudo netstat -tuln | grep 80. 포트가 안 보이면 서비스가 꺼진 거예요
  2. 방화벽 점검: iptablesfirewalld 설정 확인.
    sudo iptables -L -n -v
    sudo firewall-cmd --list-all
     - 포트가 막혀 있으면 열어야 해요.
  3. 네트워크 연결 테스트: telnet이나 nc로 연결 시도.
    telnet localhost 80
    nc -zv 127.0.0.1 80
     - "Connection refused"가 뜨면 서버 문제, 타임아웃이면 네트워크 문제.
  4. 리소스 체크: 시스템 리소스 확인.
    df -h  # 디스크 공간
    free -m  # 메모리
    ulimit -n  # 파일 디스크립터 제한
     - AI 워크로드로 인해 Too many open files 에러가 겹칠 수 있어요
  5. 로그 분석: 애플리케이션 로그나 시스템 로그 확인.
    sudo journalctl -u nginx
    tail -f /var/log/syslog
     - 에러 메시지가 원인 힌트를 줄 거예요.

이 5단계면 90% 원인을 잡아요. 현장에서 바로 써먹을 수 있죠! 😊

즉시 적용 팁: 바로 해결해보세요!

원인 찾았으면 아래 방법으로 바로 고쳐봅시다. 설정 변경 후 영구 적용하려면 /etc 디렉토리 수정 잊지 마세요!

  1. 서비스 재시작: 서비스가 꺼져 있다면 다시 시작.
    sudo systemctl start nginx
    sudo systemctl enable nginx  # 부팅 시 자동 시작
     - Spring Boot 앱이라면 java -jar app.jar 재실행.
  2. 방화벽 열기: 포트 허용.
    sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    sudo firewall-cmd --add-port=80/tcp --permanent
    sudo firewall-cmd --reload
     - 클라우드라면 AWS/GCP 보안 그룹에서 포트 열기.
  3. IP/포트 확인: ifconfig 또는 ip addr로 서버 IP 확인. 로컬호스트 대신 외부 IP(예: 192.168.1.10)로 테스트.
    curl http://192.168.1.10:80
  4. 리소스 조정: 파일 디스크립터 늘리기.
    sudo ulimit -n 65535
     - 영구 적용: /etc/security/limits.conf에 추가.
    * soft nofile 65535
    * hard nofile 65535
  5. DNS 문제 해결: /etc/resolv.conf 확인 후 DNS 서버 수정.
    echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf

테스트 후 curl이나 브라우저로 연결 확인하세요!

결론: 기초 문제도 빠르게 잡아야 빠른 퇴근 쌉가능...

"Connection Refused"는 리눅스 관리에서 초보자든 고수든 자주 마주치는 에러예요. 위 진단과 팁으로 5~10분 안에 해결 가능합니다. 2025년엔 AI 앱 배포나 Kubernetes 환경에서 이런 기초 문제가 더 자주 터질 거예요. 😅 비슷한 주제로 다음엔 "SSH 접속 실패" 다뤄볼까요?

 

[관련 포스트: 네트워크 Zero Window 발생 원인, 리눅스 패킷 Overrun 해결법]

반응형