Nginx와 Apache 차이 및 선택 기준

Nginx와 Apache 차이 및 선택 기준

웹 서버를 설치하려고 검색하면 거의 반드시 Nginx와 Apache 두 이름이 나옵니다. 둘 다 웹 서버 소프트웨어이고 둘 다 무료이고 둘 다 전 세계적으로 엄청나게 많이 사용됩니다. 그러다 보니 처음 서버를 세팅하는 입장에서는 도대체 뭘 써야 하는지 헷갈릴 수밖에 없습니다. 이번 글에서는 Apache와 Nginx가 각각 어떤 방식으로 동작하는지, 어떤 상황에서 어떤 걸 선택하면 좋은지를 정리해보겠습니다.

Apache — 오래된 만큼 안정적인 웹 서버

Apache HTTP Server는 1995년에 처음 나왔습니다. 웹이 본격적으로 퍼지던 시기에 등장해서 오랫동안 웹 서버 점유율 1위를 유지했습니다. 지금도 전체 웹 서버 중 상당한 비율을 차지하고 있고, 특히 워드프레스 같은 PHP 기반 서비스에서 많이 사용됩니다.

Apache의 가장 큰 특징은 요청 하나당 프로세스 또는 스레드를 할당하는 방식으로 동작한다는 점입니다. 사용자가 접속하면 그 요청을 처리할 프로세스가 하나 생기고, 처리가 끝나면 반환됩니다. 이 방식을 MPM(Multi-Processing Module)이라고 하는데, prefork, worker, event 세 가지 모드가 있습니다. 기본값인 prefork 모드는 프로세스 하나가 요청 하나를 담당합니다. 직관적이고 안정적이지만 동시 접속이 많아지면 프로세스 수가 급격히 늘어나면서 메모리를 많이 잡아먹는다는 단점이 있습니다.

Apache의 또 다른 특징은 .htaccess 파일입니다. 디렉토리별로 .htaccess 파일을 두면 서버 전체 설정을 건드리지 않고 해당 디렉토리의 동작만 바꿀 수 있습니다. URL 리다이렉트, 접근 제한, 인증 설정 같은 걸 디렉토리 단위로 제어할 수 있어서 공유 호스팅 환경에서 특히 유용합니다. 다만 Apache가 요청마다 .htaccess 파일을 읽어야 하기 때문에 성능에는 약간의 부담이 됩니다.

모듈 시스템도 강점입니다. mod_rewrite, mod_security, mod_php 같은 모듈을 동적으로 로드할 수 있어서 기능 확장이 유연합니다. PHP를 모듈 형태로 바로 붙일 수 있다는 점 때문에 PHP 기반 프로젝트에서는 Apache가 여전히 편리합니다.

Nginx — 대량 트래픽에 강한 웹 서버

Nginx는 2004년에 러시아 개발자 이고르 시쇼프가 만들었습니다. 당시 Apache가 동시 접속 1만 개를 넘기면 성능이 급격히 떨어지는 문제가 있었는데, 이걸 해결하려는 목적으로 개발된 겁니다. 이른바 C10K 문제라고 불리던 것입니다.

Nginx는 Apache와 근본적으로 다른 구조를 가지고 있습니다. 이벤트 기반 비동기 방식으로 동작합니다. 요청마다 프로세스를 만드는 게 아니라, 하나의 워커 프로세스가 수천 개의 연결을 동시에 처리합니다. 새 요청이 들어오면 이벤트 큐에 등록하고, 처리할 준비가 되면 처리하는 식입니다. 이 방식 덕분에 동시 접속이 많아져도 메모리 사용량이 크게 늘지 않습니다.

정적 파일 처리 속도도 Nginx가 빠릅니다. HTML, CSS, JavaScript, 이미지 같은 정적 파일을 서빙할 때 Apache보다 눈에 띄게 좋은 성능을 보여줍니다. 그래서 정적 파일이 많은 사이트에서는 Nginx가 확실히 유리합니다.

Nginx는 웹 서버 역할만 하는 게 아니라 리버스 프록시, 로드 밸런서 역할도 합니다. 앞단에 Nginx를 두고 뒤에 Node.js, Django, Spring 같은 애플리케이션 서버를 배치하는 구성이 매우 흔합니다. 이런 구조에서 Nginx는 클라이언트 요청을 받아서 뒤쪽 서버로 전달하고 응답을 돌려주는 역할을 합니다. 실무에서 Nginx를 리버스 프록시 용도로 쓰는 경우가 상당히 많습니다.

다만 Nginx는 .htaccess 같은 디렉토리별 설정 기능이 없습니다. 모든 설정을 메인 설정 파일에서 관리해야 합니다. 설정을 바꾸면 Nginx를 리로드해야 반영되기 때문에 공유 호스팅 환경에서는 불편할 수 있습니다. 하지만 직접 서버를 관리하는 환경에서는 오히려 설정이 한 곳에 모여 있어서 관리하기 편하다는 의견도 많습니다.

동작 방식 비교

Apache와 Nginx의 차이를 가장 쉽게 이해하는 방법은 식당에 비유하는 겁니다.

Apache의 prefork 방식은 손님이 올 때마다 전담 웨이터를 한 명씩 붙여주는 식당입니다. 손님이 10명이면 웨이터 10명, 100명이면 웨이터 100명이 필요합니다. 손님 하나하나한테 세심하게 대응할 수 있지만, 손님이 갑자기 몰리면 웨이터가 부족해지고 식당이 비좁아집니다.

Nginx는 웨이터 한두 명이 홀 전체를 담당하는 식당입니다. 주문을 받아놓고 음식이 준비되면 가져다주고, 그 사이에 다른 테이블 주문도 받습니다. 손님이 100명이든 1000명이든 웨이터 수는 크게 늘지 않습니다. 다만 요리가 오래 걸리는 복잡한 주문이 많으면 그건 주방(백엔드 서버)에서 처리해야 하고, Nginx는 서빙에 집중합니다.

이 차이가 실제 성능에 그대로 반영됩니다. 동시 접속이 적을 때는 둘 다 큰 차이가 없지만, 접속이 수천 단위로 올라가면 Nginx가 훨씬 적은 리소스로 버틸 수 있습니다.

PHP 처리 방식의 차이

PHP를 사용하는 경우 둘의 차이가 좀 더 명확해집니다.

Apache는 mod_php 모듈을 통해 PHP를 자체적으로 처리할 수 있습니다. Apache 프로세스 안에서 PHP가 바로 실행되기 때문에 별도의 설정 없이 PHP 파일을 요청하면 바로 처리됩니다. 워드프레스를 Apache에서 돌리는 게 간편한 이유가 이것입니다.

Nginx는 PHP를 직접 처리하지 못합니다. 대신 PHP-FPM이라는 별도의 프로세스 매니저를 통해 처리합니다. Nginx가 PHP 요청을 받으면 PHP-FPM에게 넘기고, 결과를 받아서 사용자에게 돌려주는 구조입니다. 초기 설정이 Apache보다 한 단계 더 필요하지만, PHP-FPM이 프로세스를 효율적으로 관리하기 때문에 트래픽이 많을 때는 오히려 이 구조가 더 안정적입니다.

설정 파일 구조 비교

Apache의 설정은 보통 /etc/apache2/ 디렉토리에 있습니다. apache2.conf가 메인 설정 파일이고, sites-available 폴더에 가상 호스트 설정을 만들어서 sites-enabled에 심볼릭 링크로 연결하는 방식입니다. 여기에 디렉토리별 .htaccess까지 있으니 설정이 여러 곳에 분산되어 있는 셈입니다.

Nginx의 설정은 /etc/nginx/ 디렉토리에 있습니다. nginx.conf가 메인 파일이고, 마찬가지로 sites-available과 sites-enabled 구조를 사용합니다. 다만 .htaccess가 없기 때문에 모든 설정이 이 파일들 안에 다 들어갑니다. 설정 문법도 Apache와 다릅니다. Apache는 XML 비슷한 문법을 쓰고, Nginx는 중괄호 기반의 자체 문법을 사용합니다.

설정을 바꾼 뒤에도 차이가 있습니다. Apache는 graceful restart로 무중단 반영이 가능하고, Nginx는 nginx -s reload 명령어로 설정을 리로드합니다. 둘 다 서비스 중단 없이 설정을 반영할 수 있습니다.

어떤 상황에서 뭘 선택할까

워드프레스나 PHP 기반 사이트를 공유 호스팅 환경에서 운영한다면 Apache가 편합니다. .htaccess를 통해 디렉토리별 설정이 가능하고 PHP 모듈을 바로 붙일 수 있기 때문입니다. 대부분의 웹 호스팅 업체가 Apache를 기본으로 제공하는 이유이기도 합니다.

Node.js, Python, Java 같은 백엔드 애플리케이션 앞에 웹 서버를 둘 거라면 Nginx가 적합합니다. 리버스 프록시 설정이 간단하고 정적 파일 처리 성능이 좋기 때문입니다. 요즘 배포 구조에서 가장 흔하게 보이는 조합이 Nginx + 백엔드 서버 구성입니다.

트래픽이 많거나 동시 접속이 중요한 서비스라면 Nginx가 유리합니다. 메모리 효율이 좋고 동시 처리 성능이 높기 때문입니다.

사실 최근 추세를 보면 신규 프로젝트에서는 Nginx를 선택하는 경우가 더 많습니다. 클라우드 환경과 컨테이너 기반 배포가 늘면서 가볍고 빠른 웹 서버가 선호되기 때문입니다. 하지만 Apache가 나쁜 선택이라는 뜻은 아닙니다. 이미 Apache로 잘 돌아가고 있는 서비스를 굳이 Nginx로 바꿀 이유는 없습니다.

둘 다 쓰는 경우도 있다

재미있는 건 Apache와 Nginx를 같이 쓰는 구성도 있다는 겁니다. 앞단에 Nginx를 리버스 프록시로 두고 뒤에 Apache를 배치하는 방식입니다. Nginx가 정적 파일 처리와 SSL 종료를 담당하고, 동적 요청은 Apache로 넘기는 구조입니다. 이렇게 하면 Nginx의 성능과 Apache의 모듈 호환성을 둘 다 활용할 수 있습니다. 대규모 서비스에서 가끔 이런 구성을 사용합니다.

마무리

정리하면 Apache는 오랜 역사만큼 안정적이고 PHP와의 궁합이 좋으며 디렉토리별 설정이 유연합니다. Nginx는 동시 접속 처리에 강하고 리버스 프록시 기능이 뛰어나며 메모리 효율이 좋습니다. 처음 서버를 세팅하는 거라면 자기 프로젝트가 어떤 기술 스택을 쓰는지를 먼저 확인하고, 거기에 맞는 웹 서버를 선택하면 됩니다. 다음 글에서는 Nginx를 선택했을 때 처음 마주하게 되는 설정 파일 구조를 자세히 다루겠습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *