개요
현대 웹 서비스는 수많은 사용자로부터 동시에 요청을 받으며, 그 요청을 빠르게 처리해야 합니다. 이처럼 고성능과 확장성이 필수적인 시대에 탄생한 웹 서버가 바로 Nginx(엔진엑스)입니다.
Nginx의 등장배경
기존의 대표적인 웹 서버였던 Apache HTTP Server는 스레드 기반 동기 처리 방식을 사용했습니다. 이는 동시 접속자 수가 많아질수록 성능이 급격히 저하되는 문제를 가지고 있었고, 시스템 자원을 많이 소비했습니다.
당시 웹 서버가 C10K 문제를 처리하는 데 한계를 드러내자, 이에 대응하기 위해 Nginx가 등장하게 됩니다.
⚠️ C10K 문제란?
C10K 문제는 "Client 10,000"의 약자입니다.
이는 하나의 서버에서 10,000명 이상의 클라이언트의 동시 연결을 처리하려고 할 때 생기는 성능 문제를 의미합니다.
기존 웹 서버들은 클라이언트 연결 하나당 하나의 스레드를 생성하는 구조였기 때문에, 동시 접속 수가 증가하면 CPU 및 메모리 자원이 급격히 소모되었습니다.
이를 해결하기 위해 Nginx는 이벤트 기반 비동기 I/O 모델을 채택하여 가볍고 빠른 성능을 구현했습니다.
Nginx의 주요 특징
✅ 1. 이벤트 기반 비동기 처리
- 단일 스레드에서 이벤트 루프(Event Loop)를 통해 수많은 요청을 처리합니다.
- CPU와 메모리를 최소로 사용하면서도 수천~수만 건의 동시 요청을 효율적으로 처리할 수 있습니다.
✅ 2. 리버스 프록시(Reverse Proxy)
- 클라이언트의 요청을 백엔드 서버에 전달하고, 그 응답을 클라이언트에 전달하는 중간 다리 역할을 합니다.
- 클라이언트는 백엔드 서버의 존재를 모르고, Nginx만 바라보고 요청을 보냅니다.
- Nginx는 요청을 받아서 알맞은 백엔드 서버(예: Node.js, Spring 등)로 전달하고, 그 응답을 클라이언트에게 돌려줍니다.
- 보안(외부에 백엔드 서버 IP가 노출되지 않음), 로드 밸런싱, SSL 등 다양한 기능을 수행할 수 있습니다.
- 캐싱을 통해 속도 향상
✅ 3. 로드 밸런서 역할
- 여러 서버로 트래픽을 분산하여 서버의 부하를 줄이고 장애에 대비합니다.
- 지원하는 로드 밸런싱 알고리즘
방식 설명 round-robin 기본 방식, 순차적으로 서버에 분산 least_conn 연결 수가 가장 적은 서버에 전달 ip_hash 클라이언트 IP에 따라 고정된 서버에 연결 (세션 유지에 유리) 💡 마이크로서비스 환경에서, 이 기능은 트래픽 분산, 장애 대응 측면에서 필수입니다.
✅ 4. 정적 콘텐츠 서빙
- HTML, CSS, JS, 이미지 등 정적 파일을 빠르게 응답할 수 있는 기능을 기본으로 갖추고 있습니다
PS . 🔁 포워드 프록시 vs 리버스 프록시
구분 | 포워드 프록시(Forward Proxy) | 리버스 프록시(Reverse Proxy) |
역할 | 클라이언트의 요청을 서버에 전달 | 클라이언트 요청을 대신 받아 백엔드에 전달 |
사용 예 | 학교, 회사 등에서 웹 필터링 및 캐싱 | 웹 서버 로드밸런싱, SSL 종료, 보안 강화 |
예시 | VPN, 스쿼드(Squid), 브라우저 프록시 설정 | Nginx, HAProxy 등 |
위치 | 클라이언트 앞단 | 서버 앞단 |
🔎 예를 들어, 회사 네트워크에서 특정 웹사이트를 차단하는 경우는 포워드 프록시,
대규모 웹 서비스에서 Nginx가 클라이언트 요청을 여러 서버로 분산시키는 것은 리버스 프록시입니다.
Nginx의 활용 예시
- 웹서버
- 정적 콘텐츠 제공
- 클라이언트 요청 처리
- 리버스 프록시 서버
- API 게이트웨이 역할
- 로드 밸런서
- SSL 종료 서버
- 보안 연결을 처리하여 백엔드 서버의 부담 감소
- 마이크로서비스 아키텍처의 진입점
🖼️ Nginx의 동작 구조
Nginx의 기본 구조는 Master-Worker 프로세스 모델로 구성되어 있습니다.
- Master Process: 설정 파일을 읽고, Worker Process를 관리합니다.
- Worker Process: 클라이언트의 요청을 처리하며, 각 Worker는 독립적으로 동작합니다.
이러한 구조는 높은 확장성과 안정성을 제공합니다.
관련 글 모음
'Nginx' 카테고리의 다른 글
[Nginx] Lua로 JWT 인증 처리하기 – API Gateway에 인증 붙이기 feat. Lua 와 JWT로 사용자 정보 받아오기 (0) | 2025.04.19 |
---|---|
[NGINX] Upstream과 API Gateway의 핵심 개념과 연관관계 (0) | 2025.04.19 |
[Nginx] 환경변수 설정하고 사용하는 방법 docker- .env , Lua , 템플릿 렌더링(envsubst) (0) | 2025.04.19 |
[NGINX] Nginx의 기본 변수 받아오기와 활용법 (0) | 2025.04.19 |
[Nginx] Nginx 실행하기 (0) | 2025.04.19 |