CS/네트워크

웹 서버 소프트웨어(Nginx, Apache HTTPd)와 OSI 7계층의 관계

개발자 May 2024. 8. 10.

웹 서버(Web Server)란?

웹 서버(Web Server)는 클라이언트(주로 웹 브라우저)로부터의 HTTP/HTTPS 요청을 처리하고, 요청된 웹 페이지 또는 리소스를 제공하는 소프트웨어 또는 하드웨어를 의미한다. 웹 서버는 주로 다음과 같은 역할을 수행한다.

  1. HTTP 요청 수신:
    • 웹 서버는 클라이언트로부터 HTTP/HTTPS 요청을 수신하여 적절히 처리합니다.
  2. 정적 콘텐츠 제공:
    • HTML, CSS, JavaScript, 이미지 등 정적 파일을 클라이언트에게 제공하는 역할을 합니다.
  3. 동적 콘텐츠 요청 처리:
    • PHP, Python, Java 등으로 작성된 동적 콘텐츠 요청은 웹 애플리케이션 서버(WAS)나 스크립트 엔진으로 전달하여 처리합니다.
  4. 리버스 프록시 및 로드 밸런싱:
    • 리버스 프록시로서 내부 서버에 요청을 전달하고, 로드 밸런싱을 통해 서버 간 트래픽을 분배합니다.
  5. 보안 기능:
    • SSL/TLS 암호화를 통해 안전한 통신을 보장하며, 방화벽 및 액세스 제어 기능을 제공합니다.

Nginx란?

Nginx는 고성능의 HTTP 서버이자 리버스 프록시 서버로, 높은 동시 연결 처리를 위해 설계되었다. Apache HTTPd가 더 오래되었지만, 2023년 7월 기준으로 웹 서버 시장 점유율 1위가 되었다. Nginx가 제공하는 주요 기능을 살펴보자.

  1. 고성능 비동기 처리:
    • 이벤트 기반의 비동기 아키텍처를 통해 높은 동시 연결 수를 효율적으로 처리할 수 있다. 이는 멀티 프로세싱 모듈 기반인 Apache HTTPd와 대표적인 차이점이다.
  2. 정적 파일 서비스:
    • Nginx는 정적 콘텐츠를 빠르게 제공하며, 캐싱 기능을 통해 성능을 극대화할 수 있다. 예를 들어, 서버 내 특정 경로에 이미지, HTML, CSS Stylesheet을 저장해두고, Nginx를 통해 조건을 정의하면 해당 콘텐츠로 응답할 수 있다.
  3. 리버스 프록시:
    • 클라이언트의 요청을 내부 서버로 전달하고, 응답을 클라이언트로 반환한다. 이를 통해 내부 서버에 외부 요청이 접근할 수 없도록 막아 보안을 강화할 수 있다.
    • Nginx는 SSL 종료, 요청 라우팅, 로드 밸런싱을 포함하여 다양한 프록시 기능을 지원한다.
  4. 로드 밸런싱:
    • 여러 서버 간의 트래픽을 분배하여 부하를 균등하게 하고, 시스템의 안정성과 가용성을 향상시킬 수 있다. Nginx는 라운드 로빈, 최소 연결, IP 해시 등 다양한 로드 밸런싱 알고리즘을 지원한다.
  5. 보안 및 확장성:
    • 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 도메인 소켓으로 요청 전달
    }
}

참고

NGINX STORE - Nginx Docs

nginx documentation

댓글