Nginx 컨테이너가 특정 업스트림을 찾지 못해 종료되는 현상을 경험해 보셨나요? Master-Worker 구조를 통해 Nginx가 외부 환경에 구애받지 않고 독립적으로 동작하게 만드는 방법을 알아봅니다.
웹 서버를 구축하다 보면 예기치 못한 설정 오류로 컨테이너가 무한 재시작되는 루프에 빠지곤 합니다. 특히 Nginx를 프록시 서버로 사용할 때, 접근할 수 없는 외부 경로에 대한 설정이 부팅 단계에서 치명적인 장애를 유발하는 경우가 많습니다.
“정적 설정인데, 왜 런타임이 아닌 부팅 시점에 문제가 생길까?
이 의문을 해결하기 위해 Nginx의 프로세스 아키텍처와 도메인 해석(DNS Resolution) 시점을 파헤쳐 보겠습니다.
Nginx가 기동되어 트래픽을 처리하기까지의 과정은 크게 두 단계로 나뉩니다.
Nginx 바이너리가 실행되자마자 설정 파일(nginx.conf)을 읽어들입니다. 이때 모든 구문 오류와 고정된 도메인의 유효성을 체크합니다.
Master로부터 명령을 받은 Worker 프로세스들이 실제로 클라이언트의 요청을 받아 비즈니스 로직(프록시, 정적 파일 서빙 등)을 처리합니다.
기본적인 프록시 설정은 1번 단계에서 모든 도메인의 IP를 확정지으려 합니다. 따라서 뒷단 컨테이너가 아직 준비되지 않았다면 Nginx는 스스로 목숨을 끊어버립니다.
Nginx가 왜 이런 방식으로 동작하는지 이해하려면, 그 근간이 되는 아키텍처를 살펴봐야 합니다.
과거 웹 서버가 겪었던 C10K(10,000 Client) 문제를 해결하기 위해 Nginx는 비동기 이벤트 기반(Event-Driven) 모델과 Master-Worker 구조를 도입했습니다.
Nginx의 효율적인 데이터 처리에 대해 더 궁금하다면, Zero-copy와 커널 레벨의 I/O 원리를 다룬 TCP 서버 내부 동작 포스트를 참고해보세요.
Nginx가 프록시를 처리할 때, 도메인을 어떻게 작성하느냐에 따라 Master와 Worker의 역할이 완전히 달라집니다.
proxy_pass http://ui-back-gateway:11500; 처럼 도메인을 직접 입력하는 경우입니다.
변수를 통한 DNS 지연 해석 방식은 특히 마이크로서비스 아키텍처(MSA)나 컨테이너 환경에서 유용합니다.
resolver 8.8.8.8; 과 같이 DNS 서버 주소를 명시해야 합니다.우리는 보통 Nginx를 뒷단 서버를 보호하기 위한 방패로 사용합니다. 하지만 방패 자체가 환경 의존성 때문에 펴지지도 못한다면 의미가 없겠죠.