Apache httpd와 Nginx 차이점

· ApacheNginxWeb ServerMiddlewareLinuxAI-assisted


Written with AI assistance. 실제 적용 전에는 공식 문서와 운영 환경의 설정을 함께 확인해야 합니다.

Apache httpd와 Nginx는 둘 다 대표적인 Web Server다. 둘 다 정적 파일을 제공할 수 있고, HTTPS를 처리할 수 있고, 뒤쪽 WAS나 애플리케이션 서버로 요청을 넘기는 Reverse Proxy 역할도 할 수 있다.

그런데 운영 문서나 장애 분석 글을 보다 보면 둘을 꽤 다르게 설명한다.

처음에는 이 설명이 조금 추상적으로 느껴진다. 둘 다 80/443 포트를 열고 HTTP 요청을 받는 서버인데, 무엇이 그렇게 다른 걸까?

핵심 차이는 “요청과 연결을 어떻게 처리하도록 설계되었는가”에 있다.

먼저 이름부터 구분하기

여기서 말하는 Apache는 Apache HTTP Server, 흔히 httpd라고 부르는 웹 서버다.

Apache Tomcat과는 다르다.

이름역할
Apache HTTP Server, httpdWeb Server
Apache TomcatJava Servlet Container / WAS
NginxWeb Server / Reverse Proxy

Apache httpd와 Nginx는 Web Server 계층에 있고, Tomcat은 Java 애플리케이션을 실행하는 WAS에 가깝다.

Client
  -> Apache httpd or Nginx
  -> Tomcat / Node.js / PHP-FPM / other backend
  -> Application
  -> DB

한 줄로 보는 차이

Apache httpd는 오랜 기간 다양한 환경에서 쓰이며 모듈 생태계와 디렉터리 단위 설정에 강점이 있는 웹 서버다.

Nginx는 많은 동시 연결을 적은 리소스로 처리하는 데 초점을 두고 설계되었고, Reverse Proxy와 정적 파일 처리에 강점이 있는 웹 서버다.

둘 중 하나가 항상 더 좋다는 뜻은 아니다. 운영 관점에서는 “어느 쪽이 더 빠른가”보다 현재 시스템에서 어떤 역할로 쓰이고 있는지를 먼저 봐야 한다.

Apache httpd의 특징

Apache httpd는 역사가 긴 만큼 기능과 모듈 생태계가 넓다. mod_ssl, mod_proxy, mod_rewrite, mod_jk, mod_auth 계열처럼 필요한 기능을 모듈로 붙여 쓰는 구조다.

대표적인 설정 단위는 VirtualHost다.

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    ProxyPass "/" "http://127.0.0.1:8080/"
    ProxyPassReverse "/" "http://127.0.0.1:8080/"

    ErrorLog logs/example-error.log
    CustomLog logs/example-access.log combined
</VirtualHost>

Apache httpd를 볼 때 자주 확인하는 것은 다음과 같다.

확인 항목예시
설정 파일httpd.conf, apache2.conf, conf.d/*.conf, sites-enabled/*
가상 호스트VirtualHost, ServerName, DocumentRoot
모듈mod_ssl, mod_proxy, mod_rewrite, mod_jk
로그access_log, error_log
처리 모델MPM: prefork, worker, event

Apache httpd를 설명할 때 “요청마다 프로세스나 스레드를 생성한다”고 단순화하는 경우가 많다. 큰 틀에서는 프로세스/스레드 모델로 이해해도 되지만, 실제로는 MPM(Multi-Processing Module)에 따라 동작 방식이 달라진다.

MPM특징
prefork스레드 없이 여러 프로세스로 요청 처리
worker프로세스와 스레드를 함께 사용
eventkeep-alive 연결 처리를 개선한 이벤트 기반 MPM

그래서 “Apache는 무조건 느리다”라고 말하면 부정확하다. 다만 많은 동시 연결을 오래 붙잡고 있는 환경에서는 프로세스/스레드 기반 모델이 리소스 부담으로 이어질 수 있고, 이 지점에서 Nginx와 비교가 자주 나온다.

Nginx의 특징

Nginx는 처음부터 많은 동시 연결을 효율적으로 처리하는 방향으로 설계된 웹 서버다. 기본 구조는 master process와 worker process로 설명한다.

nginx master process
  -> worker process
  -> worker process
  -> worker process

master process는 설정을 읽고 worker를 관리한다. worker process는 실제 요청을 처리한다. Nginx의 worker는 하나의 요청에 프로세스나 스레드를 길게 붙이는 방식이 아니라, 이벤트 기반으로 여러 연결을 동시에 처리하는 구조에 가깝다.

대표적인 설정 단위는 serverlocation이다.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Nginx를 볼 때 자주 확인하는 것은 다음과 같다.

확인 항목예시
설정 파일nginx.conf, conf.d/*.conf, sites-enabled/*
가상 서버server, server_name, listen
경로 매칭location
backend 그룹upstream
프록시 설정proxy_pass, proxy_set_header, timeout
로그access.log, error.log

Nginx는 앞단에서 Reverse Proxy, 정적 파일 제공, 로드밸런싱, TLS termination 역할로 많이 사용된다. Tomcat, Node.js, Spring Boot, PHP-FPM 같은 뒤쪽 서버를 직접 외부에 노출하지 않고, Nginx가 앞에서 요청을 받아 내부로 넘기는 구조가 흔하다.

요청 처리 방식의 차이

가장 근본적인 차이는 요청과 연결을 다루는 방식이다.

항목Apache httpdNginx
기본 관점요청을 처리할 실행 단위를 프로세스/스레드 중심으로 구성worker가 이벤트 기반으로 많은 연결을 처리
처리 모델MPM에 따라 prefork, worker, event 사용master/worker + event-driven 구조
동시 연결연결 수가 늘면 프로세스/스레드 리소스 영향을 크게 받을 수 있음많은 idle connection이나 동시 연결 처리에 강점
설정 단위VirtualHost, Directory, Location, .htaccessserver, location, upstream
확장 방식다양한 모듈 생태계Reverse Proxy, 정적 파일, upstream 처리에 단순하고 강한 구조
디렉터리별 설정.htaccess 사용 가능.htaccess 없음. 중앙 설정 파일에서 관리

이 차이는 평소에는 잘 안 보이고, 장애가 나면 드러난다.

예를 들어 접속이 느려지거나 502/503이 발생했을 때 Apache httpd라면 MPM 설정, worker 수, keep-alive, 모듈 로그, backend 연결 상태를 같이 본다.

Nginx라면 worker connection, upstream 상태, proxy_pass 대상, timeout, error log의 upstream 메시지를 먼저 보게 된다.

설정 구조의 차이

Apache httpd는 디렉터리 단위 설정이 강하다. 특히 .htaccess를 사용하면 특정 디렉터리 아래에서 rewrite, 인증, 접근 제어 같은 설정을 애플리케이션 배포 단위에 가깝게 둘 수 있다.

이 방식은 공유 호스팅이나 레거시 PHP 애플리케이션 환경에서 유용했다. 애플리케이션별로 설정을 분리하기 쉽고, 서버 전체 설정을 수정하지 않아도 일부 동작을 바꿀 수 있기 때문이다.

대신 요청마다 디렉터리 설정을 확인해야 하므로 성능이나 관리 측면에서는 부담이 될 수 있다. 운영 환경에서는 .htaccess 사용 여부와 AllowOverride 설정을 확인해야 한다.

Nginx는 .htaccess 같은 디렉터리별 런타임 설정 파일을 사용하지 않는다. 보통 nginx.confconf.d/*.conf 같은 중앙 설정 파일에 server, location, upstream을 명시한다.

이 방식은 설정 위치가 명확하다. 대신 애플리케이션 담당자가 디렉터리 안에 파일 하나 넣어서 웹 서버 동작을 바꾸는 방식은 통하지 않는다. 설정 변경 후에는 nginx -t로 문법을 확인하고 reload하는 흐름이 일반적이다.

Reverse Proxy 관점의 차이

둘 다 Reverse Proxy가 가능하다.

Apache httpd에서는 mod_proxy, mod_proxy_http, mod_proxy_ajp, mod_jk 같은 모듈을 통해 backend로 요청을 넘긴다.

ProxyPass "/" "http://127.0.0.1:8080/"
ProxyPassReverse "/" "http://127.0.0.1:8080/"

Nginx에서는 proxy_passupstream을 사용한다.

upstream app_backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;

    location / {
        proxy_pass http://app_backend;
    }
}

둘 다 외부 요청을 내부 WAS로 전달할 수 있지만, Nginx는 Reverse Proxy와 upstream 문법이 단순해서 자주 쓰인다. 그래서 현대적인 구성에서는 Nginx를 앞단에 두고 뒤쪽에 Tomcat, Spring Boot, Node.js, PHP-FPM 등을 두는 구성이 흔하다.

Apache httpd는 기존 Apache 기반 서비스, .htaccess, 특정 모듈, AJP 연동, 레거시 설정과의 호환성이 필요한 환경에서 계속 많이 쓰인다.

정적 파일 처리 관점

정적 파일은 실행 로직 없이 그대로 내려주는 파일이다.

/index.html
/static/app.css
/images/logo.png
/assets/main.js

Nginx는 정적 파일 제공과 많은 동시 연결 처리에 강점이 있어 이미지, CSS, JavaScript, 다운로드 파일을 앞단에서 처리하는 데 자주 쓰인다.

Apache httpd도 정적 파일을 제공할 수 있고 실제로 많이 사용된다. 다만 “정적 파일 + Reverse Proxy + 높은 동시 연결” 조합에서는 Nginx를 선호하는 경우가 많다.

중요한 것은 이름보다 역할 분리다.

Client
  -> Web Server: 정적 파일, TLS, routing
  -> WAS: 동적 애플리케이션 로직
  -> DB: 데이터 조회/저장

정적 파일 요청까지 모두 WAS로 보내면 WAS는 애플리케이션 로직 외의 일까지 떠안게 된다. 그래서 Web Server 앞단에서 처리할 수 있는 것은 앞단에서 처리하고, 동적 요청만 WAS로 넘기는 구성이 운영상 유리하다.

같은 질문, 다른 문법

명령어만 따로 외우면 금방 헷갈린다. 운영에서 마주치는 질문은 두 서버가 같고, 문법만 다르다. 그래서 질문 기준으로 보는 편이 낫다.

질문Apache httpdNginx
설정 문법은 정상인가?httpd -t, apachectl configtestnginx -t
어떤 도메인을 받는가?VirtualHost, ServerNameserver, server_name
어떤 경로를 어디로 보내는가?ProxyPass, RewriteRule, Locationlocation, proxy_pass
backend는 어디인가?ProxyPass 대상, workers.propertiesupstream, proxy_pass
요청이 도착했는가?access_logaccess.log
왜 실패했는가?error_log, module logerror.log, upstream error
실제 클라이언트 IP는 남는가?LogFormat, XFF headerreal_ip_header, XFF header
reload 전에 검증했는가?httpd -t 후 reloadnginx -t 후 reload

장애 대응에서는 “Apache냐 Nginx냐”보다 다음 순서가 중요하다.

  1. Web Server까지 요청이 도착했는가?
  2. Web Server가 어떤 설정으로 요청을 매칭했는가?
  3. backend WAS로 요청을 넘겼는가?
  4. backend가 정상 응답했는가?
  5. 에러 페이지는 Web Server, WAS, LB 중 누가 만든 것인가?

그래서 무엇을 선택해야 하나

새 시스템을 설계한다면 Nginx를 앞단 Reverse Proxy로 두는 구성이 많이 쓰인다. 설정이 단순하고, 정적 파일 처리와 동시 연결 처리, upstream 전달에 강점이 있기 때문이다.

반대로 기존 서비스가 Apache httpd 모듈이나 .htaccess, AJP 연동, 레거시 PHP 환경에 의존하고 있다면 Apache httpd를 유지하거나 Apache 기반으로 구성하는 것이 더 현실적일 수 있다.

선택 기준은 단순히 “어느 쪽이 더 빠른가”가 아니다.

기준Apache httpd가 자연스러운 경우Nginx가 자연스러운 경우
기존 환경Apache 모듈, .htaccess, 레거시 설정 의존새로 구성하는 Reverse Proxy 앞단
동시 연결연결 수가 크지 않고 기존 설정 호환이 중요많은 동시 연결과 정적 파일 처리가 중요
설정 방식디렉터리별 설정, 다양한 모듈 활용중앙 설정 파일로 명확하게 관리
WAS 연동mod_proxy, mod_jk, AJP 연동proxy_pass, upstream 기반 HTTP proxy

정리

Apache httpd와 Nginx는 둘 다 Web Server지만 설계 방향이 다르다.

Apache httpd는 모듈 생태계, VirtualHost, .htaccess, 레거시 호환성에 강점이 있다. 요청 처리 방식은 MPM에 따라 달라지며, 운영에서는 MPM 설정, 모듈, 로그, backend 연동을 함께 봐야 한다.

Nginx는 master/worker와 이벤트 기반 구조를 바탕으로 많은 동시 연결을 효율적으로 처리하는 데 강점이 있다. 운영에서는 server, location, upstream, proxy_pass, timeout, access/error log를 중심으로 본다.

결국 봐야 할 건 서버 이름이 아니라 요청 흐름이다.

Client
  -> Apache httpd or Nginx
  -> WAS
  -> Application
  -> DB

요청이 어디까지 왔고, 어느 설정에 걸렸고, 어디로 넘어갔는지. 이 세 가지를 추적할 수 있으면 Apache냐 Nginx냐는 문법 차이일 뿐이다.

참고 자료


← Blog 목록