콘텐츠로 이동

2024 07 09

2024-07-09

Nginx proxy_pass DNS 문제

문제상황

  • proxy_pass로 https://domain.com 을 매핑하였음
  • https://domain.com 의 A record를 변경하였음
  • 변경된 IP로 요청이 넘어가는 줄 알았으나, nginx는 하염없이 도메인에 이전에 매핑된 IP로 요청을 보냄

원인 파악

참고: https://tech.kkung.net/blog/nginx-with-elb/
참고: https://community.f5.com/discussions/technicalforum/does-nginx-1-20-or-newer-re-resolve-dns-for-proxy-pass/303654
참고: https://circlee7.medium.com/nginx-proxy-pass-%EC%9D%98-aws-elb-%EC%97%B0%EA%B2%B0-%EC%84%A4%EC%A0%95-f0c4b792ef71
참고: https://community.f5.com/discussions/technicalforum/does-nginx-1-20-or-newer-re-resolve-dns-for-proxy-pass/303654

  • Nginx를 Reverse Proxy로 사용시에 주의할 점
    • 글 예시에서는 AWS ELB를 엔드포인트로 proxy_pass
      • ELB의 IP는 변경될 수 있음 + 복수의 IP로 제공
    • proxy_pass를 직접 지정함으로써 Nginx는 설정파일을 읽는 시점에 DNS에 대한 IP 변환을 수행한다. (resolve)

참고: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

  • Nginx가 proxy_pass를 읽는 법
    • 만약, 해당 도메인이 여러개의 Ip를 반환한다면 서버 그룹으로 묶어 라운드 로빈 방식으로 처리
    • proxy_pass에서 domain_name으로 특정된다면...
      1. 서버 그룹에서 찾고
      2. 없으면 리졸버에서 찾음

해결 방법

참고: https://betterstack.com/community/questions/how-to-force-nginx-to-resolve-dns-every-proxy-pass/

  1. 도메인의 A record 변경 후 nginx reload를 통한 재시작 (자주 IP가 변경되지 않는다면 이 방법으로 해결)
  2. resolver와 set을 통해 nginx 설정
    http {
      # 30초에 한번씩 DNS를 조회하도록 설정
      resolver <DNS_IP> valid=30s;
    
      server {
        listen 443;
    
        location / {
          resolver <DNS_IP> valid=30s;
          set $backend-api "https://domain.com";
    
          proxy_pass $backend-api;
        }
      }
    }