웹 서버(Web Server)란?
웹 서버(Web Server)는 클라이언트(주로 웹 브라우저)로부터의 HTTP/HTTPS 요청을 처리하고, 요청된 웹 페이지 또는 리소스를 제공하는 소프트웨어 또는 하드웨어를 의미한다. 웹 서버는 주로 다음과 같은 역할을 수행한다.
- HTTP 요청 수신:
- 웹 서버는 클라이언트로부터 HTTP/HTTPS 요청을 수신하여 적절히 처리합니다.
- 정적 콘텐츠 제공:
- HTML, CSS, JavaScript, 이미지 등 정적 파일을 클라이언트에게 제공하는 역할을 합니다.
- 동적 콘텐츠 요청 처리:
- PHP, Python, Java 등으로 작성된 동적 콘텐츠 요청은 웹 애플리케이션 서버(WAS)나 스크립트 엔진으로 전달하여 처리합니다.
- 리버스 프록시 및 로드 밸런싱:
- 리버스 프록시로서 내부 서버에 요청을 전달하고, 로드 밸런싱을 통해 서버 간 트래픽을 분배합니다.
- 보안 기능:
- SSL/TLS 암호화를 통해 안전한 통신을 보장하며, 방화벽 및 액세스 제어 기능을 제공합니다.
Nginx란?
Nginx는 고성능의 HTTP 서버이자 리버스 프록시 서버로, 높은 동시 연결 처리를 위해 설계되었다. Apache HTTPd가 더 오래되었지만, 2023년 7월 기준으로 웹 서버 시장 점유율 1위가 되었다. Nginx가 제공하는 주요 기능을 살펴보자.
- 고성능 비동기 처리:
- 이벤트 기반의 비동기 아키텍처를 통해 높은 동시 연결 수를 효율적으로 처리할 수 있다. 이는 멀티 프로세싱 모듈 기반인 Apache HTTPd와 대표적인 차이점이다.
- 정적 파일 서비스:
- Nginx는 정적 콘텐츠를 빠르게 제공하며, 캐싱 기능을 통해 성능을 극대화할 수 있다. 예를 들어, 서버 내 특정 경로에 이미지, HTML, CSS Stylesheet을 저장해두고, Nginx를 통해 조건을 정의하면 해당 콘텐츠로 응답할 수 있다.
- 리버스 프록시:
- 클라이언트의 요청을 내부 서버로 전달하고, 응답을 클라이언트로 반환한다. 이를 통해 내부 서버에 외부 요청이 접근할 수 없도록 막아 보안을 강화할 수 있다.
- Nginx는 SSL 종료, 요청 라우팅, 로드 밸런싱을 포함하여 다양한 프록시 기능을 지원한다.
- 로드 밸런싱:
- 여러 서버 간의 트래픽을 분배하여 부하를 균등하게 하고, 시스템의 안정성과 가용성을 향상시킬 수 있다. Nginx는 라운드 로빈, 최소 연결, IP 해시 등 다양한 로드 밸런싱 알고리즘을 지원한다.
- 보안 및 확장성:
- SSL/TLS 지원을 통해 안전한 통신을 보장하며, 다양한 모듈을 통해 기능을 확장할 수 있다.
Nginx는 OSI 7계층 중 몇 계층에서 작동할까?
웹 서버의 대표적인 역할인 HTTP/HTTPS 프로토콜을 사용한 요청을 처리한다는 측면에서 응용 계층인 7계층에서 동작한다고 볼 수 있다.
그런데 Nginx의 문서를 살펴보면, TCP/UDP 스트림을 처리할 수 있는 기능도 지원하고 있다. 그렇기에 전송 계층인 4계층에서도 동작한다고 말할 수 있겠다.
아래 TCP/UDP 연결을 처리하는 예시 설정 파일을 살펴보자. 많이들 사용하는 HTTP 리버스 프록시 기능을 마찬가지로 사용할 수 있다.
stream {
# TCP/UDP 연결을 처리하기 위한 스트림 모듈 설정 블록
# HTTP 트래픽을 처리하는 설정 블록은 http 블록을 별도로 생성한다.
upstream backend {
# 'backend'라는 이름의 업스트림 서버 그룹 정의
hash $remote_addr consistent;
# 클라이언트의 IP 주소를 기반으로 일관된 해시를 사용하여 서버 선택
# 이는 클라이언트의 동일한 IP로부터 오는 요청이 항상 같은 서버로 라우팅되도록 보장한다.
server backend1.example.com:12345 weight=5;
# backend1.example.com:12345 서버에 가중치(weight) 5를 부여하여 다른 서버보다 더 많은 요청을 받도록 설정
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
# 로컬호스트(127.0.0.1)의 포트 12345에 연결하는 서버 정의
# 이 서버가 30초 내에 3회 실패하면 일시적으로 사용하지 않는다.
server unix:/tmp/backend3;
# /tmp/backend3 Unix 도메인 소켓을 사용하는 서버 정의
}
upstream dns {
# 'dns'라는 이름의 업스트림 서버 그룹 정의
server 192.168.0.1:53535;
# IP 주소 192.168.0.1의 포트 53535로 요청을 라우팅
server dns.example.com:53;
# dns.example.com 도메인에 있는 포트 53으로 요청을 라우팅
}
server {
listen 12345;
# TCP 포트 12345에서 들어오는 요청 수신
proxy_pass backend;
# 'backend' 업스트림 서버 그룹으로 요청 전달
}
server {
listen 127.0.0.1:53 udp reuseport;
# 로컬호스트의 UDP 포트 53에서 들어오는 요청을 수신하며, 소켓을 여러 워커 프로세스가 재사용할 수 있도록 설정한다.
proxy_pass dns;
# 'dns' 업스트림 서버 그룹으로 요청을 전달합니다.
}
server {
listen [::1]:12345;
# 로컬호스트의 IPv6 주소 [::1]의 TCP 포트 12345에서 들어오는 요청 수신
proxy_pass unix:/tmp/stream.socket;
# /tmp/stream.socket Unix 도메인 소켓으로 요청 전달
}
}
참고
'CS > 네트워크' 카테고리의 다른 글
TCP/IP 4계층 vs OSI 7계층 각각 정의하고 차이점 알아보기! (0) | 2024.08.08 |
---|---|
CORS, SOP란 무엇일까? CORS 에러 회피하기! (0) | 2024.08.07 |
HTTP와 RESTful API, REST란? (0) | 2024.08.06 |
HTTP 메서드(GET, POST, PUT, PATCH, DELETE ...)와 멱등성(Idempotent)에 대한 정리 (0) | 2024.08.06 |
HTTPS와 TLS Handshake(TLS 1.3v과 이전 버전의 차이) (0) | 2024.08.05 |
댓글