Nginx 와 Apache의 차이 (Nginx vs Apache)

2025. 8. 21. 22:32·Infra/네트워크

현재 유지보수하는 레거시 프로젝트와 같은 테스트 환경을 사내망에서 구축하고 있다.

 

여기서 웹서버인 Apache를 활용해서 리버스 프록시하는 아키텍처를 활용하는데 왜 Apache 사용하는지와, Nginx 와 Apache 의 차이점이 무엇인지 생각해보자

 

Nginx와 Apache 는 둘다 오픈소스 webserver이다.

 

# Apache Nginx의 구조

 

## Apache의 구조

Request가 생기면 그에 해당하는 프로세스를 활용한다. 이때 가용할 프로세스가 없으면 새로 프로세스를 추가해서 할당해야 한다.

 

그래서 Prefork MPM을 통해 부모 프로세스가 자식 프로세스를 미리 생성해 유휴 프로세스의 최소/최대 기준을 유지하도록 동적으로 수를 조절하여, 새로운 요청을 유휴 프로세스에 즉시 할당한다.

 

여기서 문제는 자식 프로세스 하나당 동시에 하나의 연결만 처리하기 때문에, CPU 코어 수 대비 과도한 프로세스가 생기면 컨텍스트 스위칭 비용이 커질 수 있다.

 

그리고 스레드가 아닌 프로세스 기반이라 각 프로세스가 독립 주소 공간을 가져 메모리 사용량이 상대적으로 크지만, 스레드-세이프하지 않는 모듈과의 호환성 측면에서는 유리하다.

 

또다른 특징은 PHP와의 조합으로 동적 콘텐츠 제공도 수월하다.

 

## Nginx의 구조

Nginx 는 C10K 등 대량 동시 연결에 효율적인 이벤트 기반, 비동기 모델을 채택한 웹 서버/리버스 프록시이다.

 

master 프로세스는 설정파일을 읽고 설정에 맞게 워커프로세스를 생성하는 프로세스이다.

 

각 워커는 단일 스레드 이벤트 루프로 동작하며, 일반적으로 동일한 listen 소켓을 공유한다. 그리고 그 소켓에 새로운 클라이언트로부터 요청이 들어오면 커넥션을 형성하고 그 요청을 처리한다. 그렇게 그 커넥션은 keep alive 시간만큼 유지된다.

 

여기서 킥은 커넥션이 형성되었다고 워커 프로세스가 해당 커넥션 하나만 한정적으로 담당하는게 아니라, 커넥션에 아무론 요청이 없으면 새로운 커넥션을 형성하거나 이미 만들어진 다른 커넥션으로부터 들어온 요청을 처리한다.

 

Nginx에서는 이런 커넥션 형성, 커넥션 제거 그리고 새로운 요청을 처리하는 것을 이벤트라고 부른다. 그리고 그 이벤트들은 OS 커널이 큐 형식으로 워커 프로세스에게 전달해준다. 이 이벤트는 큐에 담긴 상태에서 워커프로세스가 처리할 때 까지 비동기 방식으로 대기하고 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리해나간다.

 

안에 있는 네모 칸이 큐이고, 안에서 커넥션을 생성하거나 요청을 처리하는 이벤트로 채워져 있는데, 이러면 워커 프로세스가 쉬지 않고 계속해서 일을 한다는 장점이 있다.

 

또한 요청 중 하나가 시간이 오래 걸리는 작업(디스크 I/O)을 한다면, 그 뒤에 있는 이벤트는 요청을 처리하는 긴 시간동안 블로킹이 되기 때문에 시간이 오래 걸리는 작업은 따로 스레드 풀에 그 이벤트를 위임하고, 큐 안에 있는 다른 이벤트를 처리한다.

 

이런 워커 프로세스는 보통 CPU 코어 수 만큼 생성해서 코어가 담당하는 프로세스를 바꾸는 횟수를 대폭 줄여 컨텍스트 스위칭 비용을 줄인다. 이게 바로 이벤트 기반 구조이다.

 

---

 

다음에는 Apache에서 mod_jk를 docker로 활용하는 방법에 대해 블로깅하겠다.

### 출처

https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations

https://www.youtube.com/watch?v=6FAwAXXj5N0

https://daram.tistory.com/532

'Infra > 네트워크' 카테고리의 다른 글

[IPv6] Spring boot로 ipv6 통신 해보기(+개념)  (0) 2025.10.27
[Infra] 로깅 처리를 위한 ELK 설정 (with spring)  (0) 2024.11.22
[Infra] 시스템 메트릭 모니터링 구축 (with. spring)  (0) 2024.11.22
[Infra] 포워드 프록시와 리버스 프록시 차이점  (6) 2024.10.19
'Infra/네트워크' 카테고리의 다른 글
  • [IPv6] Spring boot로 ipv6 통신 해보기(+개념)
  • [Infra] 로깅 처리를 위한 ELK 설정 (with spring)
  • [Infra] 시스템 메트릭 모니터링 구축 (with. spring)
  • [Infra] 포워드 프록시와 리버스 프록시 차이점
ckm7907
ckm7907
  • ckm7907
    백엔드 잘하고 싶어요!
    ckm7907
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • BACKEND (13)
        • Spring (13)
      • FRONTEND (1)
        • React (1)
      • Infra (11)
        • CICD (1)
        • 네트워크 (5)
        • Docker (3)
      • DBMS (2)
        • MySQL (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 글관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Docker
    docker-compose
    self-hosted
    Technitium #nginx #DNS 서버
    servlet
    EC2
    github Actions
    github
    spring boot
    비밀번호
    sha-256
    runners
    tibero studio
    tibero
    Salt
    SVC
    DockerHub
    CICD
    단방향암호화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ckm7907
Nginx 와 Apache의 차이 (Nginx vs Apache)
상단으로

티스토리툴바