ysw's blog

    Apache2 NginX Difference

    11 Dec 2018 |

    Apache Nginx

    두 웹서버의 차이점은 클라이언트 연결과 트래픽을 처리하는 방법에 있습니다.

    keyword:

    자식 프로세스, 부모 프로세스, 쓰레드
    - 정적 컨텐츠, 동적 컨텐츠 예시 찾기.

    Apache

    1. 여러 형태의 멀티프로세스 모듈(MPM)을 제공. 필요에 따라 교체가 가능.
    - 클라이언트의 요청 하나당 자식 프로세스 하나를 생성 연결이 끝날 때까지 해당 자식 프로세스가 처리를 전담.
    연결의 수가 프로세스 수보다 크게 되는 경우 성능은 급격히 떨어짐.
    prefork 방식: 자식 프로세스당 하나의 쓰레드를 사용하는 방법
    프로세스 간 메모리를 공유하지 않는 독립적인 형태이므로 안정적.
    worker 방식: 자식프로세스당 여러개의 쓰레드를 사용하는 방법.
    쓰레드 간에 메모리를 서로 공유 - 동시 접속자가 많은 사이트에 적합
    event 방식: worker와 같은 방식의 쓰레드 사용하지만 keep-alive 동작에 최적화.
    기존방식: 하나의 연결이 끝날 때까지 하나의 쓰레드가 전담하는 방식
    keep-alive: keep-alive만을 전담하는 쓰레드가 별도로 존재하고 다른 쓰레드는 처리할 일이 생길 때만 반응하는 형태.
    2. 정적 컨텐츠는 파일 기반 방법에 의존.
    - 정적 컨텐츠는 특정 언어 처리기를 worker 인스턴스에 내장하는 방법으로 처리하며 모듈로써 동적으로 적재가 가능.
    - 동적 컨텐츠 처리기가 내장되는 방식이므로 외부 프로그램에 의존하지 않고 결과적으로 설정이 비교적 단순.
    3. 디렉토리 단위의 설정이 가능.
    - 메인 설정 파일을 단순하게 유지할 수 있는 장점이 있다.
    - 디렉토리 경로(route) 접근시 동적으로 읽어지기 때문에, 파일의 설정 변경사항이 서버 재시작 없이 적용할 수 있게 됨.
    - 호스팅과 같이 사용자별로 특정권한을 가지는 상황에 유용하게 사용될 수 있다.
    단점: 특정 디렉토리에 접근할 때마다 동적으로 파싱 - 성능 저하의 발생 가능성
    특정 디렉토리 권한을 가진 일반 유저가 웹서버의 설정을 변경할 수 있다는 점에서 보안상 취약점이 될 수 있음.

    Nginx

    1. 동시성 문제를 해결하기 위해 고안, 비동기, Non-Blocking, 이벤트기반의 연결 처리
    - worker 프로세스 여러 개를 생성하며, 각 프로세스는 수천개의 연결을 처리할 수 있습니다.
    - 각 프로세스는 looping 방식으로 동작하며, 짧은 주기로 이벤트가 발생했는지 확인하고 처리하는 과정을 반복합니다.
    - 연결 정보는 looping 안에 존속하게 되며, 연결에 종속적인 이벤트들은 비동기적으로 처리됩니다.
    - 연결이 종료되면 looping에서 정보가 삭제 됩니다.
    2. 기본적으로 동적 컨텐츠 처리 기능이 없습니다. 따라서 외부 프로그램과 연결하는 형태로 설정이 됨.
    - 동적 컨텐츠의 처리가 웹서버 외부 프로그램에서만 수행되므로 정적 컨텐츠에 대한 처리 부하가 감소되는 장점이 있습니다.
    3. 디렉토리 단위 설정x, 중앙집중식 설정 형태. Apache보다 유연하지 않지만 나름 장점을 가지고 있다.
    서버비가 많이 지원된다 = Apache2
    가성비가 좋은 것을 선택해야한다 = NginX