Apach와 nginx를 사용하는 이유

Apach란?

Apach HTTP는 정적 컨텐츠를 효율적으로 제공하기 위해 사용한다.

HTTP 서버를 통해 무거운 사용자 환경의 이미지, JS, CSS, HTML 파일 같은 정적 컨텐츠를 효율적으로 제공한다. 기존 Tomcat보다 더 효율적으로 정적컨텐츠를 처리한다. 부하고 높은 상황에서는 Apache를 통합하여 사용하는 것이 좋다.

Apach Server가 제공하는 서비스

Apache는 클러스터링을 제공한다. Apache는 Tomcat에 다중 인스턴스 연결을 안정적으로 제공하는 가장 효율적인 서버다. 이 기능을 사용하는 가장 큰 이유는 인스턴스가 다운됐을 때에도 애플리케이션이 온라인 상태를 유지할 수 있다는 점이다. 또한, 배포 중에 다른 인스턴스를 온라인 상태로 제공해 사용자 요청을 처리함과 동시에 인스턴스에 코드를 배포할 수 있다. 무중단 배포가 가능하다. 무중단 배포는 다음에 다뤄본다.

Apache는 worker를 통해 분산 클러스터를 구성한다. worker.tomcat으로 연결할 Tomcat를 설정한다. Apache와 Tomcat은 AJP(Apache JServ Protocol)와 Mod_jk을 통해 요청을 분산시킨다. AJP는 어플리케이션 서버로의 로드 밸런스를 제공하고, mod_jk는 AJP 프로토콜을 톰캣과 연결하기 위해 만들어진 모듈로 사용된다. Apache의 httpd.conf에 worker.tomcat을 설정하고, 톰캣에 server.xml에서 Connector를 설정하여 연결을 구성한다.

Apache HTTP는 클라이언트 접근에 추가 게이트 역할도 해준다. 즉, 보안 문제를 해결해 준다. 사용자와 호스트 기반 보안을 제공한다. Apache HTTP에서 보안을 활성화하면 Tomcat은 활성화할 필요가 없다.

Apach Server 구성

Apache는 MPM(Multi Processing Module) 아키텍처 기반으로 클라이언트 요청을 처리한다.

MPM은 mpm_prefork, mpm_worker, mpm_event로 이뤄져 있다.

mpm_prefork – 단일 스레드 로직에서 동작. 각 서버 프로세스는 한 번에 하나의 Request를 처리. Process 기반으로 동작한다. 요청개수 만큼 프로세스를 사용한다. 대량의 메모리가 필요하고, 상대적으로 느리다. 대신 구조가 간단하고 구현이 쉽다.

mpm_worker – 동시에 여러 스레드 지원. Thread 기반으로 동작한다. 프로세스가 대량의 요청을 처리할 수 있다. 메모리를 적게 사용하고, 튜닝이 가능하다.

mpm_event – mpm_worker + keep-alive 메커니즘

img
Apache 아키텍쳐

Apach 특징

정적 컨텐츠는 전통적인 파일 기반 방식의 처리 방식을 제공한다.

동적 컨텐츠는 서버 내에서 처리한다.

OS 지원은 대부분 잘 지원한다.

서버 구성은 분산 및 중앙 집중식 구성을 제공한다. .htaccess를 통해 디렉토리 별로 추가 구성이 가능하다. 대용량 서버 아키텍쳐에서 자원만 충분하면 여러 웹 서비스를 제공한다.

60개 이상의 다양한 모듈을 지원하며, 필요에 따라 활성 및 비활성화할 수 있다. 보안 측면에서 다양한 Web 기반 DDoS 방어에 관한 기술을 제공한다.

Nginx

비동기식 이벤트 처리 중심의 아키텍처를 사용한다. Front-end 서비스가 크게 성장하면서 웹 기반의 동시 처리가 매우 중요하게 되었다. Nginx는 경량의 자원 활용과 물리적인 하드웨어로 쉽게 확장할 수 있다. 정적인 컨텐츠들을 빠르게 처리하며, 동적 처리를 별도로 담당하는 소프트웨어 스택들과 연계해서 고성능 서버를 제공하는 데 적합하다고 알려졌다. 또한 Nginx는 프록시 서버 기능도 제공한다.

img
nginx 아키텍쳐

Nginx는 프로세스나 스레드라는 개념 대신 이벤트 개념을 사용한다. 단일 Nginx 작업자가 동시에 여러 Request를 처리할 수 있다. Worker는 이벤트가 트리거 될 때마다 새로운 요청을 빠르게 선택할 수 있는 내부 루핑 시스템을 사용한다. 이벤트 비동기식으로 처리되기 때문에 다른 이벤트들이 순차적으로 지정해서 기다릴 필요가 없다.

img

Nginx 특징

Nginx는 이벤트 처리 방식, 비동기식 처리, 논블로킹 방식 처리를 통해 정적 컨텐츠를 고속으로 처리한다.

동적 컨텐츠는 처리하지 않는다.

OS 지원에서 Windows 부분은 다소 아쉬운 지원 서비스를 제공한다.

그리고 구성 방식은 중앙 집중식 구성을 채택하여 추가 구성은 하지 않는다. 하지만 가상화, 클라우드, MSA와 같은 아키텍쳐에서는 경량화와 성능 보장이라는 장점을 제공한다.

모듈 및 확장성, 보안과 관련해서는 기본적으로 다른 코어 모듈을 동적으로 로딩할 수 없다. 태생부터 성능에 포커싱했기 때문이다. 보안 부분은 코드 자체가 가볍고 경량화되어 있다보니 보안에 유리한 측면이 있다.

Context Switching 비용이 적다. Event Driven 방식의 최대 장점이다.

Nginx 프로세스 모델

Nginx는 Master Process를 기준으로 Child Process에 코어 개수만큼의 Worker Process와 2개의 Cache 관리 Process가 존재한다. Worker Process는 코어에 따라 구성되는데 config에서 worker_processes auto로 설정하면 알아서 리소스를 파악해서 효율적으로 활용한다.

img
Nginx 모델

Nginx Server가 제공하는 서비스

Nginx는 Apach에서 제공하는 대부분 기능을 제공한다. Apach와 다른 점은 정적 파일만 호스팅 해주며, 적은 자원으로 서비스를 빠르게 제공한다는 컨셉이다. 위에서 설명한 Event-Driven 방식으로 Apache 보다 작고 빠르게 서비스를 제공한다.

다른 서버로 위임. 즉, 프록시 서버 역할을 제공한다. 이를 통해 Nginx가 처리하지 못하는 동적 파일을 서버에게 처리 요청을 보낼 수 있으며, Apache 서버와 함께 사용할 수 있는 기반이 되었다.

Nginx는 장애에 대한 대응을 쉽게 할 수 있는데 upstream module를 통해 대응한다. upstream module은 Nginx에 내장된 모듈로써 부사분산, 속도 개선과 같은 역할을 할 수 있다. 요청받은 nginx는 데이터를 받기 위한 서버들에게 데이터를 전달한다. 이를 통해 nginx 서버 하나에 여러 서버를 붙일 수 있으며, 장애 발생 시 다른 서버로 연결하여 사용자가 서비스 이용에 불편함이 없도록 구성할 수 있다.

로드 밸런싱을 통해 서버 정보와 포트를 이용해서 어떤 서버가 어떤 작업을 처리할지 지정이 가능하다. upstream module과 더불어 부하 분산에 큰 역할을 담당하고 있으며, 무중단 배포 때 큰 도움이 되는 서비스다.

health check 기능은 현재 상용 버전에만 존재한다. 하지만 오픈 소스 버전에서 health check 기능을 수행하는 몇 가지 오픈 소스 모듈이 존재한다. 오픈 소스의 장점이라고 할 수 있다. 지정된 시간마다 서버가 죽었는지 확인하고 죽어 있다면 해당 서버를 제외한 살아있는 서버로 요청을 전달할 수 있다.

결론

Apach와 Nginx를 비교해 보았다. 상황에 맞게 선택해서 사용하면 좋을 것 같다. Apach와 Nginx 중 하나를 선택해서 사용하는 때도 있지만, 함께 사용하는 경우도 있다. Nginx는 정적 파일만 처리하며, 속도가 빨라서 앞단에서 사용하고, Apache는 Nginx에서 전달해주는 데이터를 받아 처리해주는 방식으로 사용하면 좋은 아키텍처가 될 것 같다. 아래는 네이버 메인 페이지의 서버 아키텍처다.

img
서버 아키텍처는 상황에 맞게 잘 활용해야한다.

함께 읽으면 좋은 글

DI 사용하는 이유와 이론 설명

참고

https://sorjfkrh5078.tistory.com/289

Leave a Comment