← 전체 글로 돌아가기

서버 운영

로컬과 서버에서 네트워크 응답이 다를 때

로컬과 운영 환경의 네트워크 동작이 다르면 포트, 디스크, 권한을 체계적으로 확인해서 환경 차이를 명확히 하면 해결할 수 있다.

로컬에서는 같은 API 요청이 정상적으로 응답하는데 서버에서는 다르게 응답할 수 있다. 이런 상황은 보통 로컬과 운영 환경의 구성 차이에서 비롯된다.

환경 차이를 명확히 한다

먼저 로컬과 운영 환경의 기본 상태를 기록한다.

# 로컬
uname -a
npm version
node -v

# 서버
uname -a
npm version
node -v

OS, Node.js 버전, 패키지 관리자 버전 등이 다를 수 있다.

포트 상태를 확인한다

애플리케이션이 사용하는 포트가 실제로 열려있고 정상적으로 응답하는지 확인한다.

sudo ss -lntp | grep 3000
curl -v http://localhost:3000

포트가 LISTEN 상태가 아니거나 응답이 없다면 애플리케이션이 실행되지 않고 있다는 뜻이다.

디스크 상태를 확인한다

디스크가 거의 찬 상태면 파일 쓰기가 실패해서 네트워크 응답이 불완전할 수 있다.

df -h
du -sh /var/log
du -sh /home

특정 디렉토리가 비정상적으로 크다면 로그나 임시 파일을 정리해야 한다.

네트워크 연결 상태를 확인한다

서버의 네트워크 인터페이스가 정상인지 확인한다.

ip link show
ip addr show
ping 8.8.8.8

외부로의 연결이 차단되어 있지 않은지, 인터넷 연결이 정상인지 확인한다.

방화벽 규칙을 확인한다

UFW나 iptables 같은 방화벽이 요청을 차단하고 있지 않은지 확인한다.

sudo ufw status
sudo iptables -L

특정 포트가 차단되어 있다면 허용해야 한다.

프록시나 로드밸런서 설정을 확인한다

서버 앞에 Nginx, Traefik 같은 프록시가 있다면 그 설정을 확인한다.

sudo nginx -t
sudo curl -I http://localhost:3000

프록시가 요청을 올바르게 전달하고 있는지, 헤더를 변조하고 있지 않은지 확인한다.

응답 헤더를 비교한다

로컬과 서버에서 같은 요청의 응답 헤더를 비교한다.

# 로컬
curl -i http://localhost:3000/api/data

# 서버
curl -i https://example.com/api/data

Content-Type, Content-Length, 캐시 헤더 등이 다를 수 있다.

응답 body의 인코딩을 확인한다

응답이 올바르게 인코딩되고 있는지 확인한다. 특히 한글 같은 특수 문자가 있는 경우 더 주의해야 한다.

curl -v http://localhost:3000/api/data | file -

응답이 UTF-8로 제대로 인코딩되어 있는지 확인한다.

권한 문제가 있는지 확인한다

애플리케이션 실행 사용자가 필요한 파일에 접근할 수 있는지 확인한다.

ls -la /path/to/app
sudo -u app-user curl http://localhost:3000

권한 부족으로 인해 특정 작업이 실패할 수 있다.

환경변수가 올바르게 설정되어 있는지 다시 확인한다

로컬과 서버의 환경변수를 비교한다. API 엔드포인트 URL, 데이터베이스 연결 문자열 등이 다를 수 있다.

env | grep API_
env | grep DATABASE_

발견한 차이점을 한 줄로 정리한다

로컬과 서버의 네트워크 동작의 차이를 명확히 한다. 예를 들어:

  • 로컬: 포트 3000에서 정상 응답
  • 서버: 포트 8080으로 프록시 설정되어 있었음

이런 식으로 차이점을 기록하면 다음에 비슷한 문제가 나올 때 빠르게 찾을 수 있다.