Nginx vs httpd

진성대·2023년 9월 28일
0

Docker

목록 보기
6/12

Httpd 와 Nginx의 차이

httpd와 nginx는 둘 다 웹 서버 소프트웨어입니다. 그러나 두 웹 서버는 설계 철학, 성능, 구성 방식 등 여러 가지 차이점이 있습니다.

출시 및 개발 배경:

httpd:

  • 1995년에 출시된 Apache HTTP Server는 오픈 소스 웹 서버로, 웹의 초기 시기부터 많은 사이트에서 사용되어 왔습니다.

nginx:

  • 2004년에 출시된 nginx는 높은 동시 연결 처리 능력에 중점을 둔 웹 서버로 설계되었습니다.

설계 철학 및 성능:

httpd:

  • MPM (Multi-Processing Module) 방식을 사용하여 각 연결마다 별도의 프로세스나 스레드를 생성합니다. 이로 인해 많은 동시 연결 시에 리소스 사용이 증가할 수 있습니다.

1. Prefork MPM:

  • 각 클라이언트 연결마다 별도의 프로세스를 생성합니다.
  • 스레드를 사용하지 않기 때문에 스레드-safe 하지 않은 라이브러리나 모듈을 사용하는 경우에 적합합니다.
  • 많은 동시 연결 시에 프로세스의 수가 급증하여 리소스 사용이 크게 증가할 수 있습니다.
PID  PPID  C STIME TTY          TIME CMD
1231     1  0 00:00 ?        00:00:00 httpd
1232  1231  0 00:00 ?        00:00:00 httpd (child process for client 1)
1233  1231  0 00:00 ?        00:00:00 httpd (child process for client 2)

클라이언트 1과 클라이언트 2에 대한 별도의 프로세스가 생성됩니다.

2. Worker MPM:

  • 각 프로세스 내에서 여러 스레드를 사용하여 요청을 처리합니다.
  • 동시 연결이 많을 경우에도 프로세스의 수는 유지되면서 스레드만 증가하여 상대적으로 리소스 효율이 좋습니다.
  • 그러나 스레드-safe한 모듈과 라이브러리를 요구합니다.
PID  PPID  C STIME TTY          TIME CMD
1231     1  0 00:00 ?        00:00:00 httpd
1232  1231  0 00:00 ?        00:00:00 httpd (worker process with multiple threads)
1233  1231  0 00:00 ?        00:00:00 httpd (worker process with multiple threads)

각 워커 프로세스는 여러 클라이언트 연결을 처리하는 여러 스레드를 포함합니다.

3. Event MPM:

  • Worker MPM과 유사하나, 요청 간의 대기 시간 동안 다른 연결을 처리할 수 있도록 최적화되어 있습니다.
  • 이벤트 기반 처리 방식으로, 활성 연결 수에 비해 리소스 사용을 줄일 수 있습니다.


nginx:

  • 비동기, 이벤트 기반의 구조를 가지고 있습니다. 이로 인해 많은 동시 연결을 적은 리소스로 효율적으로 처리할 수 있습니다.

비동기, 이벤트 기반 구조의 특징:

  • Single-threaded 이벤트 루프:

    • nginx는 단일 스레드에서 동작하는 이벤트 루프를 사용합니다.
    • 이 루프는 연속적으로 클라이언트의 요청을 체크하고, 새로운 요청이 있을 경우 그에 따른 이벤트를 처리합니다.
  • 비동기 I/O:

    • nginx는 클라이언트의 요청을 받으면, 해당 요청을 처리하는 동안 다른 요청이 블로킹되지 않습니다.
    • 예를 들어, 파일을 읽어야 하는 요청이 들어오면, nginx는 파일 시스템에 비동기적으로 읽기 요청을 하고, 즉시 이벤트 루프로 돌아와 다른 클라이언트의 요청을 처리합니다. 파일이 준비되면 다시 그 요청을 처리하는 이벤트가 발생합니다.
  • 동작 원리:

    1. 클라이언트가 nginx에 요청을 보냅니다.
    2. nginx의 이벤트 루프는 해당 요청을 감지하고, 요청을 비동기적으로 처리합니다.
    3. 요청 처리 중에 I/O 작업(예: 파일 읽기)이 필요한 경우, nginx는 그 작업을 비동기적으로 시작하고, 바로 이벤트 루프로 돌아와 다른 요청을 처리합니다.
    4. I/O 작업이 완료되면, 완료 이벤트가 발생하고, nginx는 해당 요청을 계속 처리합니다.
    5. 처리가 완료된 요청은 클라이언트에게 응답으로 반환됩니다.
  • 이로 인한 장점:

    • 효율적인 리소스 사용: 많은 연결을 처리할 때도 많은 프로세스나 스레드를 생성하지 않기 때문에 메모리와 CPU 사용이 효율적입니다.
    • 높은 동시 연결 처리 능력: 다수의 클라이언트 요청을 동시에 처리할 수 있습니다.
    • 확장성: 요청 처리 로직이 간단하고, 리소스 사용이 효율적이므로, 동일한 하드웨어에서 더 많은 요청을 처리할 수 있습니다.

기능 및 확장성:

httpd:

  • 다양한 모듈을 통해 확장이 가능합니다. 이로 인해 많은 기능을 추가할 수 있지만, 때로는 불필요한 리소스 사용을 초래할 수도 있습니다.

    httpd 는 아파치 웹 서버로, 초기 설계 단계부터 모듈화를 중요한 특성으로 간주했습니다. 이러한 httpd에 다양한 기능을 추가하거나 제거함으로써 웹 서버의 기능성과 효율성을 향상시키는데 큰 역할을 합니다.

  • 모듈화

    • httpd 의 핵심 구조는 최소한의 기본 기능만을 제공하여, 실제 상세한 기능들은 모듈로 제공됩니다. 이렇게 함으로써 사용자는 필요한 기능만 선택하여 포함시킬수 있습니다.
    # 모듈 활성화
    LoadModule ssl_module modules/mod_ssl.so     

    예를 들어 mod_ssl 모듈을 사용하여 SSL/TLS 지원을 httpd에 추가할 수 있습니다. 이 모듈을 활성화 하면 웹서버는 HTTPS 연결을 처리할 수 있습니다.

  • 기능 확장성

    • 다양한 모듈을 통해 httpd의 기능을 확장할 수 있습니다. 이를 통해 로깅, 보안, 콘텐츠 압축, 프록시 기능, URL 리다이렉션 및 리라이트 등의 다양한 기능을 추가할 수 있습니다.
      # mod_rewrite 활성화
      LoadModule rewrite_module modules/mod_rewrite.so
              
      # .htaccess 파일 또는 httpd.conf 내에서 URL 리라이트 규칙 설정
      RewriteEngine On
      RewriteRule ^oldpath$ /newpath [R=301,L]

      mod_rewrite 모듈을 사용하여 URL리라이트 규칙을 적용할 수 있습니다ㅏ. 이 모듈을 활성화 하면 다양한 URL 패턴을 새로은 URL로 리다이렉트하거나 리라이트 할 수 있습니다.

  • DSO (Dynamic Shared Object)

    • httpd에서 모듈은 DSO로 구현됩니다. 이를 통해 웹 서버가 실행중일 때 모듈을 동적으로 로드하거나 언로드 할 수 있습니다.
  • API (Application Programming Interface)

    • httpd 는 모듈 작성을 위한 확장 가능한 API를 제공합니다. 이 API를 사용하여 개발자는 웹 서버에 맞게 새로운 모듈을 개발할 수 있습니다.
  • Configuration Directives

    • 각 모듈은 웹 서버의 구성 파일에 추가할 수 있는 지시어(directives)를 제공합니다. 이 지시어들은 웹 서버의 동작을 조절하거나 특정 모듈의 기능을 설정할 때 사용됩니다.


nginx:

  • 기본적으로는 웹 서버 및 리버스 프록시 기능에 중점을 둡니다. 여러 모듈로 기능을 확장할 수 있으나, Apache만큼 다양한 공식 모듈은 제공하지 않습니다.

    nginx는 웹 서버 및 리버시 프록시 서버로 개발되었으며, 기본적인 기능 외에도 다양한 기능을 모듈로 제공합니다. nginx의 모듈 구조는 컴파일 시점에서 결정되므로, 런타임 중에 동적으로 모듈을 추가하거나 제거할 수 없습니다. 이는 Apache의 DSO 방식과는 다르게 동작합니다.

기본기능

1.웹 서버 : 정적 파일을 제공하고, 빠르게 콘텐츠를 제공합니다.
2.리버시 프록시 : 내부 네트워크에 있는 다른 서버로 클라이언트 요청을 중계합니다.

모듈로 확장할 수 있는 기능:

  1. SSL/TLS 모듈: HTTPS연결을 지원하기 위해 사용됩니다.
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        root /var/www/html;
        index index.html;
    }
}
  1. gzip 모듈 : 웹 콘텐츠를 압축하여 전송합니다.
gzip on;
gzip_types text/plain text/css application/json application/javascript;
  1. 프록시 모듈 : 다른 서버로 요청을 전달하고 그 결과를 클라이언트에게 반환합니다.
location /app/ {
    proxy_pass http://backend_server;
}
  1. 로드 밸런싱 : 여러 백엔드 서버 간의 요청을 분산합니다.
http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}
  1. FastCGI 모듈 : FastCGI 프로세스와 통신하여 동적 콘텐츠를 제공합니다.
location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

이벤트 기반 모델 : 비동기 방식으로 동작하여 고성능과 높은 확장성을 제공합니다.

모듈식 설계 : 원하는 기능만 선택하여 컴파일 할 수 있습니다.


설정 및 운영:

httpd:

  • .htaccess 파일을 통해 디렉터리 기반의 세부 설정이 가능합니다.

nginx:

  • 전체 서버 설정에 대한 명확한 구조를 가지고 있으며, .htaccess와 같은 디렉터리 기반 설정은 지원하지 않습니다.

용도:

httpd:

  • 일반적인 웹 호스팅, 웹 애플리케이션 서버 등 다양한 용도로 사용됩니다.

nginx:

  • 웹 서버로 사용되며, 리버스 프록시, 로드 밸런서, 메일 프록시 서버로도 자주 사용됩니다.
profile
신입 개발자

0개의 댓글