← 전체 글로 돌아가기

서버 운영

Nginx 리버스 프록시가 요청을 안 넘길 때

Nginx 뒤의 여러 서버로 요청을 분배해야 하는데, 특정 요청이 제대로 전달되지 않을 때 확인하는 방법을 정리했다.

Nginx를 리버스 프록시로 쓸 때, 로컬에서는 잘 작동하는데 배포 환경에서 요청이 전달되지 않거나 응답이 이상할 때가 있다. 이런 경우는 DNS, 캐시, 프록시 규칙 중 하나가 문제일 가능성이 높다.

먼저 DNS 응답 확인하기

요청이 제대로 라우팅되려면 먼저 DNS가 정확하게 응답해야 한다. 도메인이 올바른 IP로 해석되는지 확인한다.

  • 먼저 볼 값: DNS A 레코드 응답, IP 주소
  • 같이 비교할 값: 설정했던 원본 IP, 기대하는 서버 주소
  • 기록해둘 것: dig/nslookup 결과, TTL, 변경 시간

dig로 DNS 조회하기

# DNS 응답 확인
dig example.com
dig example.com +short

# 특정 네임서버에서 조회
dig @8.8.8.8 example.com

# DNS 추적
dig +trace example.com

HTTP 상태 코드로 원인 파악하기

응답 코드가 무엇인지에 따라 원인이 달라진다. 404면 뒷단 서버를 못 찾은 것, 502면 뒷단 서버가 응답 없는 것, 504면 타임아웃이다.

# 응답 코드와 헤더 확인
curl -I https://example.com

# 상세한 응답 정보
curl -v https://example.com 2>&1 | head -30

Nginx 설정 문법 검사하기

Nginx 설정에 문법 오류가 있으면 요청이 제대로 라우팅되지 않는다. 설정을 수정한 후에는 항상 문법을 검사한 다음 리로드한다.

# 설정 파일 문법 검사
sudo nginx -t

# 설정이 정상이면 리로드
sudo systemctl reload nginx

프록시 규칙과 location 블록 확인

Nginx의 location 블록에서 어느 경로를 어디로 보낼지 설정한다. 경로 매칭 우선순위를 이해해야 제대로 라우팅된다.

# 정확한 경로 매칭 (우선도 높음)
location = /api {
  proxy_pass http://backend;
}

# 접두사 매칭
location /api/ {
  proxy_pass http://backend;
}

# 정규표현식
location ~ ^/api/v[0-9]+/ {
  proxy_pass http://backend;
}

뒷단 서버 상태 확인하기

Nginx가 요청을 보낸 서버가 실제로 응답하는지 확인해야 한다. 서버의 포트가 열려있는지, 서비스가 실행 중인지 본다.

# 열린 포트 확인
sudo ss -lntp

# 특정 서버로 직접 요청
curl http://localhost:3000/api

캐시와 CDN 무효화

Cloudflare 같은 CDN이 앞단에 있다면, 그쪽 캐시 규칙도 영향을 줄 수 있다. CDN에서 요청을 제대로 전달하는지 확인한다.

타임아웃 설정 확인

Nginx의 타임아웃 설정이 너무 짧으면 뒷단 서버의 응답을 받기 전에 요청이 끊길 수 있다. 뒷단 서버의 응답 시간에 맞춰 타임아웃을 조정한다.

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

Nginx 문제는 계층별로 나누어서 생각하면 된다. DNS 응답 → Nginx 라우팅 → 뒷단 서버 응답, 이 순서대로 각각을 확인하면 문제가 어디 있는지 빠르게 파악할 수 있다.