공부메모 & 오류해결/Infra

[Nginx] Nginx란 무엇이고 왜 사용할까?

남건욱 2024. 12. 10. 20:33
반응형

목차

1. 개요

1.1 리액트와 스프링 부트 조합의 특징
1.2 엔진엑스를 도입하는 일반적인 시나리오

2. Nginx를 사용하는 이유

2.1 정적 파일 서빙 최적화
2.2 로드 밸런싱 및 리버스 프록시 기능
2.3 확장성과 유연한 설정

3. 스프링 부트 내장 서버로 정적 파일 서빙 시 한계점

3.1 성능적 제약
3.2 배포 및 확장성 문제
3.3 보안 및 인증서 관리 불편

4. 엔진엑스 + 리버스 프록시 설정의 이점

4.1 단일 도메인 통합 및 CORS 문제 완화
4.2 독립적 배포, 스케일링 및 운영 편의성
4.3 보안 강화 및 성능 최적화
4.4 트래픽 라우팅과 A/B 테스트 용이성

5. 다른 대안들과 비교

5.1 아파치(HTTPD) 대비 장점
5.2 Node.js 기반 정적 서버 대비 장점
5.3 클라우드 로드밸런서 또는 CDN 대비 장단점

6. 결론

 

 

 

 

 

1. 개요

개인 프로젝트에서 스프링부트 + 리액트를 사용해 배포를 하는 도중 Nginx에 관해 궁금해서 조사를 하고 게시글을 작성한다.

1.1 리액트와 스프링 부트 조합의 특징

리액트는 빌드 과정 이후 모든 화면 구성을 정적 파일(HTML, CSS, JS)로 제공하고, 스프링 부트는 REST API 형태로 동적 데이터를 제공하는 구조를 갖는다. 이렇게 서버와 화면을 분리하는 아키텍처는 일반적으로 볼 수 있고,  배포에 유연하며 확장이 용이하다고 볼 수 있다.

 

1.2 엔진엑스를 도입하는 일반적인 시나리오

보통은 리액트 정적 파일을 효율적으로 서빙하고, 백엔드 API를 안정적으로 프록시하면서 하나의 도메인 아래에서 서비스를 제공하고자 할 때 Nginx를 리버스 프록시로 도입한다. CORS 문제를 간편하게 해결하며 HTTPS 설정, 로드밸런싱, 캐시와 성능의 최적화 등의 편의 기능을 쉽게 추가할 수 있도록 도와준다.

 

 

2. Nginx를 사용하는 이유

2.1 정적 파일 서빙 최적화

리액트 빌드 결과물은 결국 정적 파일 집합이다. Nginx는 이벤트 기반으로 설계되어 많은 동시 접속에서도 메모리 사용량이 적은 편이며, 빠른 응답 속도를 제공한다. 

 

2.2 로드 밸런싱 및 리버스 프록시 기능

단순한 정적 서버를 넘어서 서버로 요청을 프록시하는 리버스 프록시 역할을 수행한다. 이를 통해 api 요청은 백엔드로, 정적 요청은 프론트로 라우팅 할 수 있다. 또한 서버 인스턴스 증가나 A/B 테스트를 위한 로드밸런싱 등 정책을 손쉽게 적용할 수 있다.

 

2.3 확장성과 유연한 설정

엔진엑스는 설정 파일로 URL 리라이팅, 캐시, Gzip 압축, HTTP/2 지원 등 다양한 기능을 손쉽게 추가할 수 있다. 이것은 코드 변경이 필요 없이 인프라 설정만으로도 성능 최적화와 기능 확장이 가능하다는 점에서 큰 장점으로 볼 수 있다.

 

 

3. 스프링 부트 내장 서버로 정적 파일 서빙 시 한계점

3.1 성능적 제약

스프링 부트 내장 서버(예: 톰캣)는 동적 요청 처리에 초점이 맞춰져 있다. 물론 정적 파일도 서빙이 가능하지만, 과부하 상황에서 Nginx만큼은 효율적이지 않을 수 있다. 트래픽이 몰린 상황에서 정적 파일 서빙만으로도 애플리케이션 서버 리소스가 소진되는 일이 생길 수 있기 때문이다.

3.2 배포 및 확장성 문제

프론트, 백엔드를 하나의 JAR나 WAR에 패키징하면, 이것을 확장하거나 분리해 배포하기가 어렵다. Nginx를 사용하면 프론트와 백엔드 서버를 별도로 관리할 수 있고, 필요에 따라 각각을 독립적으로 확장할 수 있다.

3.3 보안 및 인증서 관리 불편

HTTPS 인증서 관리, TLS 종료, 리다이렉트, 다양한 헤더 설정 등을 모두 스프링 부트 내장 서버 안에서 처리하려면 복잡도가 커진다. 반면 Nginx를 앞단에 두면 이와 같은 보안 관련 기능을 설정 파일 몇 줄로 쉽게 처리할 수 있다.

 

 

4. 엔진엑스 + 리버스 프록시 설정의 이점

4.1 단일 도메인 통합 및 CORS 문제 완화

프론트와 백엔드를 다른 서브도메인이나 다른 포트에서 운영할 경우 CORS 문제가 발생한다. Nginx의 리버스 프록시를 사용해 /는 리액트 정적 파일, /api는 스프링 부트 서버로 라우팅 하면 같은 도메인에서 모든 요청을 처리하게 되어 CORS 이슈가 최소화되는 장점이 있다.

 

4.2 독립적 배포, 스케일링 및 운영 편의성

프론트엔드와 백엔드가 완전히 분리되어 배포되고, 엔진엑스가 이를 합쳐주는 형태이므로 각 부분의 배포와 업데이트가 간편하다. 필요하면 백엔드 서버만 확장하거나, 정적 리소스를 CDN에 올려 전 세계에 캐시 하는 등 유연한 아키텍처 구성이 가능하다.

 

4.3 보안 강화 및 성능 최적화

엔진엑스 레벨에서 SSL/TLS 종료를 처리하면 백엔드는 내부적으로 HTTP만 사용해도 된다. 또한 Gzip 압축, 캐싱 정책, HTTP/2 등의 설정을 손쉽게 적용해 성능과 보안을 모두 강화할 수 있다.

4.4 트래픽 라우팅과 A/B 테스트 용이성

Nginx 설정만 조정하면 특정 URL 패턴이나 IP에 따라 요청을 다른 서버로 보낼 수 있다. 이는 새로운 버전을 테스트하거나 특정 인원에게만 새로운 기능을 제공하는 A/B 테스트를 손쉽게 가능하게 한다.

5. 다른 대안들과 비교

5.1 아파치(HTTPD) 대비 장점

아파치는 프로세스/스레드 기반으로 동작하며, 많은 접속에 상대적으로 많은 메모리 사용량을 요구한다. 반면 Nginx는 이벤트 기반 모델을 이용해 더 적은 리소스로 높은 동시성을 처리한다. 또한 설정 파일 구조가 단순하고 명료해 운영 부담이 적다.

 

5.2 Node.js 기반 정적 서버 대비 장점

Node.js는 주로 동적인 로직 처리나 SSR 용도로 사용되며, 정적 파일 서빙만을 위해 Node.js 서버를 돌리는 것은 비효율적이다. Nginx는 정적 서빙에 특화되어 있으며, 시스템 자원도 더 적게 차지한다.

5.3 클라우드 로드밸런서 또는 CDN 대비 장단점

AWS ALB, GCP Load Balancer, CloudFront 등의 CDN을 활용할 수도 있다. CDN은 전 세계 엣지 서버를 활용해 성능을 극대화하는 강점을 갖지만, 커스터마이징 측면에서는 Nginx가 더 유연하다. 상황에 따라 Nginx와 CDN을 조합하여 인프라 최적화를 극대화할 수도 있다.

 

 

6. 결론

리액트와 스프링부트 조합에 Nginx를 도입해 정적 파일 서빙 성능을 극대화하고, 단일 도메인 아래 프론트와 백엔드를 통합하여 CORS 문제를 완화할 수 있다. 또한 HTTPS 설정, 로드밸런싱, 성능 최적화, A/B 테스트 등 다양한 운영상의 이점을 손쉽게 구현할 수 있다. 결국 Nginx는 단순히 정적 서버가 아닌, 유연하고 확장성 높은 인프라 계층을 제공하는 도구이므로, 리액트와 스프링부트 기반 애플리케이션 운용 시 고려해 보면 좋을 것 같다.

반응형
프로필사진

남건욱's 공부기록