서버 운영
브라우저에서 서버에 접속할 수 없을 때
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
배포 환경에서는 애플리케이션 포트와 공개 포트가 다를 수 있으니, 모두 확인해야 한다.