구리

[Nginx] 동적 IP일 때 proxy_pass 연결 끊기는 에러 본문

오류해결

[Nginx] 동적 IP일 때 proxy_pass 연결 끊기는 에러

guriguriguri 2023. 12. 5. 22:06

업무 중 만난 Nginx 관련 에러를 해결한 과정을 작성한 글입니다.

이슈

회사에서 작업하는 서비스는 프론트엔드, 백엔드 각각의 프로젝트로 구성되어 있고 프론트엔드는 React + Nginx 기반입니다.

배포 환경(Docker Rancher)에서는 프론트엔드, 백엔드 컨테이너를 각각 띄우고 모든 요청은 Nginx가 받아 특정 path로 요청이 올 경우 proxy_pass를 이용해 백엔드로 요청을 전달하는 구조입니다.

아래는 Nginx proxy_pass 코드 일부입니다.

  location /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass http://백엔드_컨테이너명;
    }

이때 백엔드 컨테이너를 업그레이드하면 nginx 연결이 끊겨 백엔드 컨테이너 업그레이드시 프론트엔드 컨테이너도 재시작을 해야하는 문제가 생겼습니다.

원인

위처럼 nginx 설정을 정의하면 nginx가 설정 파일을 읽는 시점에만 도메인의 ip를 resolve 하기에 ip가 변경된다면 업데이트되지 않는 것이 원인이었습니다.

해결

proxy_pass에 도메인을 직접 입력하는 것이 아니라 변수로 할당하고 resolver ip를 작성해줍니다.

그러면 nginx는 resolver dns를 참조해 매번 ip를 찾아가기에 백엔드 컨테이너 ip가 동적으로 바뀌는 상황에도 연결이 끊기지 않게 됩니다. 

    resolver [resolver ip] valid=5s;
    set $api_server "백엔드_컨테이너명:백엔드_컨테이너_port";


    location /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass http://$api_server;
    }

참고로 다시 연결하기까지 몇초의 시간이 소요될 수 있으며 저의 경우, resolver ip는 rancher resolving server ip로 작성하였지만 상황에 맞게 변경하면 될 것 같습니다.

참고 자료

https://www.nginx.com/blog/dns-service-discovery-nginx-plus/

 

DNS for Service Discovery with NGINX and NGINX Plus

Explore five methods for service discovery in NGINX and NGINX Plus that use DNS records, including SRV records in NGINX Plus R9.

www.nginx.com

https://serverfault.com/questions/560632/some-nginx-reverse-proxy-configs-stops-working-once-a-day?source=post_page-----f0c4b792ef71--------------------------------

 

Some nginx reverse proxy configs stops working once a day

I have an nginx reverse-proxy which proxies requests from an outer amazon ELB to internal ELBs. I have 6 backend instances that handles the requests. The site-enabled configs looks like this, but ...

serverfault.com

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

 

Nginx proxy_pass 의 AWS ELB 연결 문제

어느날 nginx 의 proxy_pass 에서pending이 걸렸다. (두둥)

circlee7.medium.com

https://github.com/rancher/rancher/issues/8148

 

how to get rancher internal dns server ip? · Issue #8148 · rancher/rancher

where use nginx, some error just like: Upstream server temporarily disabled the problem just like this : http://forum.predix.io/questions/1774/upstream-server-temporarily-disabled.html I have to fi...

github.com