← 전체 글로 돌아가기

서버 운영

브라우저에서 서버에 접속할 수 없을 때

localhost에서는 되는데 다른 기기나 호스트명으로 접속하면 안 되는 경우가 있다. 방화벽과 네트워크 문제를 빠르게 진단하는 방법을 정리했다.

인터넷 연결은 되는데 특정 포트로의 접근이 막혀 있을 수 있다. 방화벽, DNS, 라우팅 어디서나 차단될 수 있다.

호스트 이름 확인

DNS 해석이 제대로 되는지 먼저 본다.

# Linux/macOS
nslookup example.com
dig example.com
getent hosts example.com  # /etc/hosts 확인

# Windows
ipconfig /all
nslookup example.com

example.com이 실제 IP로 변환되지 않으면, DNS 설정이나 /etc/hosts를 확인해야 한다.

포트가 열려 있는지 확인

호스트 쪽에서:

# 포트가 listen 중인지 확인
sudo ss -lntp | grep 3000
# 또는
sudo lsof -i :3000

Listen 상태가 아니면, 애플리케이션이 시작되지 않았거나 다른 포트에서 실행 중이다.

원격 호스트에서 포트 접근 테스트

# nc로 포트 접근 가능성 확인
nc -zv example.com 3000

# curl로 실제 응답 확인
curl -v http://example.com:3000

# 또는 timeout을 두고
timeout 5 bash -c 'echo > /dev/tcp/example.com/3000' && echo "Open" || echo "Closed"

Connection timeout이 나면 방화벽이 막고 있거나, 라우팅 경로가 없다는 뜻이다.

서버 측 바인드 주소 확인

Node.js 앱이 localhost (127.0.0.1)에만 바인드되어 있으면, 원격에서 접속할 수 없다.

// 잘못된 설정
app.listen(3000, 'localhost');

// 올바른 설정 (모든 인터페이스)
app.listen(3000, '0.0.0.0');

Next.js 같은 경우:

npm run dev -- -H 0.0.0.0 -p 3000

방화벽 규칙 확인

UFW (Ubuntu):

sudo ufw status
sudo ufw allow 3000
sudo ufw enable

iptables (Linux):

sudo iptables -L -n | grep 3000

# 포트 허용
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT

Windows:

netsh advfirewall firewall show rule name=all | findstr 3000
netsh advfirewall firewall add rule name="Allow 3000" dir=in action=allow protocol=tcp localport=3000

네트워크 경로 추적

패킷이 실제로 호스트에 도달하는지 확인한다.

traceroute example.com
mtr -r example.com  # 실시간 모니터링

Hop이 중간에 끊기거나 "*"로 표시되면, 라우팅 문제나 네트워크 오류다.

브라우저 개발자 도구로 요청 상태 확인

Network 탭에서:

  • ERR_NAME_NOT_RESOLVED: DNS 해석 실패
  • ERR_CONNECTION_REFUSED: 포트가 열려있지 않음
  • ERR_CONNECTION_TIMED_OUT: 방화벽 또는 라우팅 문제
  • ERR_ADDRESS_UNREACHABLE: IP 주소 자체에 도달 불가

프로덕션 환경일 때

Next.js를 Dokploy나 Docker로 배포했다면:

# 컨테이너가 올바른 포트에서 listen 중인지
docker ps
docker logs <container_id>

# 리버스 프록시(nginx, Traefik)가 제대로 설정되었는지
sudo curl http://localhost/api/health

배포 환경에서는 애플리케이션 포트와 공개 포트가 다를 수 있으니, 모두 확인해야 한다.