웹 서버와 Nginx

이성민·2025년 1월 28일
post-thumbnail

프로젝트 중 Nginx에 대하여 알게 되었습니다. Nginx에 대해 공부를 하면서 개념 정리도 필요했고, 실제 적용 전 내용 정리도 필요로 하다고 생각해 내용 정리를 해 보았습니다.

들어가기 앞서 Web server와 WAS(Web Application Server)에 대해 짧게 설명하고 Nginx로 넘어가겠습니다.


웹서버(Web Server)란?

웹서버는 클라이언트(사용자)가 브라우저 주소창에 URL을 입력하여 어떤 페이지를 요청하게 되면 http 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를 사용자에게 전달합니다.

대표적 웹서버 종류) Apache, Nginx

WAS(Web Application Server)란?

WAS는 웹서버와 동일하게 HTTP 기반으로 동작합니다. 또한, 웹서버가 할 수가 있는 기능 대부분이 WAS에서도 처리가 가능합니다. 그리고 비즈니스 로직을 처리할 수 있어 사용자에게 동적인 콘텐츠를 전달 할 수가 있으며, 주로 데이터베이스 서버와 같이 수행됩니다.

대표적 WAS 종류) Tomcat, WebSphere


앞서 짧게 설명한 웹 서버에는 대표적으로 Apache Server 와 Nginx 가 있습니다. 이에 대해 자세히 설명하겠습니다.

Apache Server란?

아파치는 월드와이드 웹 서버용 소프트웨어이다. HTTP 아파치 서버라고도 불리고, HTTP 웹 서버이다. 리눅스나 윈도우 등 거의 모든 운영체제에서 사용할 수 있으며 구축이 쉽고, 다양한 추가기능을 가지고 있기 때문에 현재 가장 인기있는 웹서버로 이용되고 있다.

Apache Server 구조와 동작원리

Apache Server는 클라이언트의 요청이 들어오면 Connection을 생성합니다. 즉, 요청마다 Thread 을 만들어서 처리합니다.

Client 의 요청에 대해 Apache 자식 프로세스를 생성하여 처리합니다.
부모 프로세스로 부터 생성된 자식 프로세스는 하나의 쓰레드를 갖는 구조이며, 응답 프로세스를 미리 띄어놓고 클라이언트 요청 시 자식 프로세스가 반응합니다.

(Nginx 위주의 글이라 Apache에 대해 생략한 부분이 있습니다.)

Apache Server 한계

Apache Server 는 클라이언트의 요청 마다 Connection을 생성하며 이는 곧 프로세스/쓰레드 생성을 의미합니다.
대량의 클라이언트(1만 이상) 가 동시에 Connection 을 맺는다면 CPU/메모리 사용이 증가하고 프로세스/쓰레드 생성 비용이 드는 등 요청에 한계가 존재합니다.

이를 C10k(Connection 10000 problem) 라고 합니다. 즉 1만개 이상의 동시 Connection에는 Apache Server에 문제가 생길 수 있다는 뜻입니다.
또한, Apache Server의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있습니다.


Nginx란?

Nginx는 고성능 HTTP 웹 서버, 리버스 프록시, 이메일 프록시 등을 제공하는 소프트웨어입니다.

Nginx에서 제공하는 기능들 개념

  • 웹 서버: 클라이언트의 요청에 따라 HTML 파일이나 이미지와 같은 정적 콘텐츠를 제공합니다. Nginx는 이러한 정적 리소스를 처리하는 데 있어 매우 빠르고 효율적입니다.

  • 리버스 프록시: 클라이언트와 하나 이상의 서버 사이에서 중개자 역할을 합니다. 클라이언트로부터 요청을 받아, 그 요청을 서버들에 분산시키고 결과를 다시 클라이언트에게 전달합니다. 이를 통해 부하 분산, 안정성 향상, 보안 강화 등의 이점을 제공합니다.

  • 로드 밸런서: 여러 서버에 걸쳐 들어오는 네트워크 트래픽을 분산시키는 기능을 합니다. 이를 통해 어떤 서버에 과부하가 발생하지 않도록 하며, 전체 애플리케이션의 가용성과 확장성을 높입니다.

  • HTTP 캐시: 자주 요청되는 웹 페이지나 파일을 메모리에 저장해 두었다가, 동일한 요청이 들어올 때 빠르게 제공하여 서버의 부하를 줄이고 응답 시간을 단축시키는 기능입니다.

Nginx 특징

  • 비동기 이벤트 처리:
    Nginx는 비동기 이벤트 기반 모델을 사용합니다. 이는 동시에 많은 연결을 효율적 으로 처리할 수 있도록 해주며, 이로 인해 높은 동시성과 성능을 제공합니다.

  • 높은 성능과 안정성:
    Nginx는 높은 성능을 유지하면서도 안정적인 서비스를 제공합니다. 이는 웹 사이트 의 로딩 시간을 단축시키고 사용자 경험을 개선하는 데 도움이 됩니다.

  • 다양한 기능 제공:
    Ngjinx는 단순한 웹 서버 기능뿐만 아니라 리버스 프록시, 로드 밸런서, HTTP 캐시 등 다양한 기능을 제공합니다. 이를 통해 웹 애플리케이션의 성능을 최적화하고 보안을 강화할 수 있습니 다.

  • 낮은 메모리 사용량:
    Nginx의 비동기 처리 방식 덕분에, 상대적으로 낮은 메모리 사용량으로 많은 수의 동시 연결을 처리할 수 있습니다.

  • 유연한 설정:
    Nginx는 매우 유연한 설정이 가능하여, 다양한 용도와 환경에 맞게 세부적인 조정이 가능 합니다.

Nginx 의 구조와 동작 원리

  • Nginx는 설정파일을 읽고, 설정에 맞게 worker process를 생성하는 master process가 있습니다.

  • worker process는 실제로 일을 하는 프로세스이며 worker process가 만들어질 때 지정된 listen 소켓을 배정받습니다.

  • 그 소켓에 새로운 클라이언트의 요청이 들어오면 connection을 형성하고 처리합니다.

  • connection은 정해진 Keep-Alive 시간만큼 유지됩니다. 하지만 connection이 형성되었다고 해서 worker process가 해당 connection 하나만 담당하지는 않습니다.

  • 형성된 connection으로부터 아무런 요청이 없다면 새로운 connection을 형성하거나 이미 만들어진 다른 connection으로부터 들어온 요청을 처리합니다.

Nginx에서는 이러한 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(event)라고 합니다.

  • 이 이벤트들은 os커널이 queue형식으로 worker process에게 전달합니다.

  • 이 이벤트들은 queue에 담긴 상태에서 비동기 상태로 대기합니다.

  • worker process는 하나의 스레드로 이벤트를 꺼내서 처리해 나갑니다.

  • 이런 방식은 worker process가 쉬지 않고 일을 하기에, 요청이 없을 때 프로세스를 방치시키는 Apache Server보다 훨씬 효율적으로 자원을 사용할 수 있습니다.

Apache 방식인 스레드 기반은 하나의 커넥션 당 하나의 스레드를 잡아먹지만 이벤트 기반 방식은 여러 개의 connection을 전부 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 합니다.

이러한 이벤트 기반 구조가 바로 Nginx의 핵심입니다.

Nginx 장단점

장점

  • 높은 동시성 처리 능력: Nginx는 비동기 이벤트 기반의 아키텍처를 가지고 있어, 수천에서 수만 개의 동시 연결을 효율적으로 처리할 수 있습니다.

  • 낮은 메모리 사용량: Nginx는 매우 효율적인 메모리 관리로 인해, 상대적으로 낮은 자원으로도 높은 성능을 유지할 수 있습니다.

  • 다양한 기능 제공: 리버스 프록시, 로드 밸런서, HTTP 캐싱, SSL/TSL 처리 등 다양한 기능을 하나의 소프트웨어 내에서 제공합니다.

  • 유연한 구성 가능: 강력하고 유연한 구성 시스템을 통해 다양한 사용 사례에 맞게 세밀한 설정이 가능합니다.

  • 확장성: 모듈식 아키텍처 덕분에 사용자가 필요에 따라 기능을 추가하거나 수정할 수 있습니다.

단점

  • 동적 콘텐츠 처리: Nginx 자체는 동적 콘텐츠를 처리하는 데 있어 Apache와 같은 전통적인 웹 서버보다 비효율적일 수 있습니다. 보통은 PHP-FPM과 같은 외부 프로세서와 연동하여 이 문제를 해결합니다.

  • 구성 파일 복잡도: Nginx의 구성 파일은 매우 유연하지만, 초보자에게는 복잡하고 어렵게 느껴질 수 있습니다. 이는 학습 곡선을 가파르게 만듭니다.

  • 모듈 설치: Nginx는 필요한 모듈을 컴파일 시점에 추가해야 합니다. 이는 Apache와 같은 서버에 비해 모듈 추가가 더 번거로울 수 있습니다.

많이 부족한 부분도 있을 수 있습니다. Nginx에 대한 내용을 최대한 쉽게 정리해보았습니다.

profile
BE 개발자

0개의 댓글