Nginx란 무엇인가?
Nginx(엔진엑스)는 오픈 소스 웹 서버 소프트웨어이다. 또 다른 오픈 소스 웹 서버인 Apache와 마찬가지로 정적 콘텐츠 제공, 리버스 프록시 역할 등을 수행한다. Nginx는 높은 성능, 낮은 리소스 소비, 높은 동시 연결 처리 능력으로 유명하다.
Nginx와 Apache의 주요 차이점
특징 | Nginx | Apache |
아키텍처 | 비동기 이벤트 기반 | 멀티스레드/멀티프로세스 기반 |
동시 연결 처리 능력 | 높은 동시 연결 처리 성능 | 연결 수 증가 시 리소스 사용량 증가 |
정적 콘텐츠 처리 성능 | 매우 빠름 | 상대적으로 느림 |
동적 콘텐츠 처리 | 백엔드 서버를 통해 처리 | 모듈을 통해 직접 처리 가능 (예: PHP-FPM) |
로드 밸런싱 | 기본적으로 로드 밸런싱 기능 제공 | 로드 밸런싱은 별도의 설정 필요 |
모듈화 | 정적 모듈 방식 | 동적 및 정적 모듈 지원 (유연한 확장 가능) |
설정 복잡도 | 상대적으로 간단 | 유연하지만 복잡한 설정 |
HTTP/2 및 최신 프로토콜 | 기본적으로 지원 | 최신 프로토콜 지원 가능 (별도 설정 필요) |
SSL/TLS 처리 | 간단하고 빠름 | OpenSSL 기반으로 유사하게 처리 |
사용 사례 | 고성능, 고부하 환경에서 적합 | 소규모 또는 복잡한 기능 요구 사항에 적합 |
Nginx의 특징
- 비동기 이벤트 기반 아키텍처
- 이벤트 기반으로 요청을 처리하며, 다수의 요청을 효율적으로 처리.
- 낮은 리소스 소비로 높은 동시 연결 처리 가능. 높은 동시 요청 처리에도 메모리 사용량이 적어, 저사양 서버에서도 효과적으로 작동.
- 정적 파일 처리 성능
- HTML, CSS, JS, 이미지 등 정적 콘텐츠 제공에서 최고의 성능.
- 리버스 프록시와 로드 밸런싱
- 로드 밸런싱 및 백엔드 서버 프록싱에 최적화.
- 확장성
- 모듈식 설계로 필요한 기능만 추가하거나 구성 가능.
- HTTP/2 및 최신 프로토콜 지원
- HTTP/2, WebSocket, gRPC 같은 최신 웹 기술을 지원.
Apache의 특징
- 멀티스레드/멀티프로세스 기반 아키텍처
- 정적 콘텐츠 등의 요청을 별도의 프로세스 또는 스레드로 처리.
- 유연하지만, 연결 수가 많아질수록 리소스 사용량이 크게 증가.
- 동적 콘텐츠 처리
- PHP, Python 같은 스크립트 언어를 모듈 형태로 실행 가능.
- 예: mod_php, mod_python.
- 유연한 설정 및 모듈 지원
- 다수의 동적 모듈 제공(로깅, 인증, 동적 콘텐츠 등).
- 사용자 정의 설정을 .htaccess 파일로 쉽게 변경 가능.
Nginx가 적합한 경우:
- 정적 콘텐츠 중심의 서비스 정적 파일(HTML, CSS, 이미지 등)을 빠르게 제공해야 하는 경우.
- 고성능 및 고부하 환경 동시 요청 수가 많은 대규모 웹 애플리케이션.
- 리버스 프록시 또는 로드 밸런싱 백엔드 서버 앞단에서 프록시와 부하 분산이 필요한 경우.
- 최신 프로토콜 지원 HTTP/2, WebSocket, gRPC 등 최신 기술을 사용하는 서비스.
Apache가 적합한 경우:
- 동적 콘텐츠 처리 PHP, Python, Perl 같은 스크립트를 직접 실행해야 하는 경우.
- 기존 레거시 시스템 기존 Apache 기반의 설정 또는 시스템이 많은 경우.
- 복잡한 설정 필요 .htaccess 파일을 활용하여 사용자별 맞춤 설정을 적용해야 하는 경우.
- 소규모 프로젝트 트래픽이 많지 않고 간단한 설정이 필요한 경우.
Nginx의 주요 역할
- 웹 서버:
- HTTP 요청을 처리하고 정적 콘텐츠(HTML, CSS, JS, 이미지 등)를 제공.
- 동적 요청은 백엔드 서버(예: Gunicorn, uWSGI)로 전달.
- 리버스 프록시:
- 클라이언트 요청을 받아 백엔드 서버로 전달하고, 백엔드의 응답을 클라이언트로 반환.
- Gunicorn, Node.js, PHP-FPM 등과 함께 사용.
웹 서버와 리버스 프록시 서버의 공통 역할
1. 동적 요청 처리
- 리버스 프록시 서버: 클라이언트의 동적 요청(예: API 호출)을 백엔드 애플리케이션 서버(예: Flask, Django, Node.js)로 전달하고, 해당 서버의 응답을 클라이언트로 반환한다.
- 웹 서버:스스로 동적 요청을 처리하거나, 처리할 수 없는 경우 백엔드 서버로 전달.
2. 정적 파일 제공
둘 다 CSS, JS, 이미지와 같은 정적 파일을 직접 클라이언트에 제공할 수 있다.
Nginx와 같은 리버스 프록시 서버는 웹 서버 역할도 겸할 수 있으므로, 정적 파일 처리를 효율적으로 수행한다.
3. 요청 라우팅
요청 URL을 기반으로 적절한 서버 등으로 라우팅한다.
예를 들면, /api는 백엔드로 전달하고, /static은 로컬에서 제공한다.
4. SSL/TLS 암호화
클라이언트와 서버 간 HTTPS 연결을 처리할 수 있다.
리버스 프록시 서버는 HTTPS를 해독한 뒤 백엔드로 HTTP 요청을 전달할 수도 있다.
웹 서버와 리버스 프록시 서버의 차이점
주요 목적 | 클라이언트 요청을 처리하고 응답 제공 | 백엔드 서버와 클라이언트 사이의 중계 역할 |
요청 처리 주체 | 클라이언트의 요청을 직접 처리하거나 백엔드로 전달 | 클라이언트 요청을 받아 백엔드 서버로 전달 |
백엔드 서버와의 관계 | 백엔드 서버 없이도 단독으로 동작 가능 | 백엔드 서버가 반드시 필요 |
정적 파일 제공 | 주된 역할 (HTML, CSS, JS 제공) | 선택적 역할, 보통 백엔드 서버와 통합 |
로드 밸런싱 | 보통 지원하지 않음 | 요청을 여러 백엔드 서버로 분산 |
SSL/TLS | HTTPS 트래픽 처리 가능 | 클라이언트와 백엔드 서버 간 암호화 해제 및 전달 가능 |
사용 사례 | 정적 웹 사이트, 간단한 애플리케이션 서비스 | 복잡한 애플리케이션 배포 환경에서 백엔드 서버 보호 및 확장 |
왜 리버스 프록시를 별도로 사용하는가?
웹 서버와 리버스 프록시 서버는 겹치는 기능(예: 동적 요청 전달, 정적 파일 제공 등)을 가지지만, 웹 서버는 주로 요청을 직접 처리하고, 리버스 프록시는 요청을 백엔드로 전달하는 중간 역할에 더 중점을 둔다. 또한 리버스 프록시 서버는 주로 백엔드 서버 보호와 부하 분산, 최적화와 같은 고급 기능을 수행하기 위해 대규모 서비스엥서 자주 사용된다.
- 보안 강화:
- 백엔드 서버가 외부에 노출되지 않도록 보호.
- Nginx 같은 리버스 프록시가 DDoS 방어, SSL 처리, 요청 필터링 수행.
- 성능 향상:
- 정적 콘텐츠를 리버스 프록시에서 처리하여 백엔드 서버 부하 감소.
- 요청을 캐싱하여 반복적인 동적 요청의 부하를 줄임.
- 확장성:
- 로드 밸런싱을 통해 요청을 여러 백엔드 서버로 분산 가능.
- 유연성:
- URL 라우팅, 프로토콜 변환(예: HTTPS -> HTTP) 등을 손쉽게 처리.
Nginx의 주요 구성 요소
- Worker Process:
- 클라이언트 요청을 실제로 처리하는 프로세스.
- 비동기 이벤트 기반으로 요청을 처리.
- Master Process:
- Nginx의 설정 파일을 읽고 Worker Process를 생성 및 관리.
- Modules:
- Nginx는 다양한 모듈을 통해 기능을 확장.
- 예: gzip 압축, 캐싱, 리버스 프록싱 등.
- Configuration 파일:
- Nginx의 동작을 정의하는 설정 파일. (nginx.conf).
- 서버 블록(server block)으로 구성되어, 각 블록은 특정 호스트나 URL 패턴을 처리.
'정글' 카테고리의 다른 글
WSGI, Gunicorn (0) | 2024.12.18 |
---|---|
OpenSSL와 자체 서명 인증서 (0) | 2024.12.18 |
PINTOS 4주차 Stack Growth (0) | 2024.10.22 |
PINTOS 3주차 가상 메모리 관리 시스템 (0) | 2024.10.15 |
PINTOS 2주차 Argument Parsing (0) | 2024.10.08 |