본문 바로가기
Infra

[Nginx] Nginx의 5가지 주요 기능을 nginx.conf 파일과 함께 알아보자

by 진꿈청 2024. 3. 16.

Nginx의 5가지 주요 기능은 뭘까?

  1. 장애를 대응하는 방법
  2. 로드 밸런싱으로 부하분산을 수행하기
  3. Keep Alive로 자원을 효율적으로 이용
  4. Sub-Domain으로 다양한 서버 호스팅
  5. 캐싱 처리로 더 빠른 속도를 제공

그러면 각각의 기능을 nginx.conf 파일로 녹여내보자.

장애 대응

참고 블로그 사진

장애 대응 기능은 Backend 서버에 관한 요청과 응답을 토대로 장애를 판단해준다.

장애 대응을 위해서는 Upstream Module을 사용하는데, max_fails, fail_timeout으로 서버의 상태를 확인한다.

  • max_fails=n : n으로 지정된 횟수만큼 연결을 실패하면 서버가 다운된 것으로 판단한다.
  • fail_timout=n : max_fails가 지정된 상태에서 n값으로 설정된 시간만큼 서버가 응답하지 않으면 서버가 다운된 것으로 판단한다.
upstream service {
    ip_hash;
    server 192.168.0.100:80
    server 192.168.0.101:80 max_fails=5 fail_timeout=15s;
}

 

ip_hash는 뭘까?

Nginx에서 ip_hash는 로드 밸런싱 알고리즘 중 하나로 사용된다. 로드 밸런서는 클라이언트의 요청을 서버 그룹내의 여러 서버 중 하나로 전달한다.
이때, ip_hash 방식은 클라이언트의 IP 주소를 기반으로 특정 서버에 요청을 지속적으로 할당하는 방식이다.

ip_hash의 작동 원리

ip_hash 방식에서는 클라이언트의 IP 주소를 해시 함수에 입력하여 결과값을 얻는다.
이 해시 값은 서버를 선택하는 데 사용되며, 동일한 클라이언트 IP 주소로부터 오는 요청은 항상 같은 서버로 전달된다.
이렇게 함으로써 사용자 세션이나 특정 정보를 유지해야 하는 애플리케이션의 경우, 세션 지속성 보장이 가능하다.

로드 밸런싱

참고 블로그 사진

 

클러스터에 설정되는 서버 정보와 포트를 upstream 모듈로 설정하여 로드 밸런싱한다. 이때, 첫 번째 설정된 서버가 우선으로 처리된다.

 

upstream myservice {
    ip_hash;
    server 192.168.0.100:80;
    server 192.168.0.101:80;
}
server {
        listen 80;
        server_name localhost;

    location / {
        proxy_pass http://myservice;

}

 

upstream 모듈을 사용해서 서버의 IP주소를 입력해둔다.

 

그 후, Server 블록안에 location 블록을 담아 프록시 패스를 설정한다.

 

Keep Alive 제어

Keep Alive는 Http 소켓 연결이 종료된 시점부터 웹 서버에 설정된 Timeout 까지 기존 소켓을 유지하는 기능이다.

Keep-Alive 옵션으로 0이면 비활성화하는 것이고 1이면 활성화로 설정할 수 있다.

keepalive_timeout으로 커넥션 시간을 설정하고 해당 설정 시간이 만료되면 Keep Alive 소켓 연결을 해제한다.

upstream myservice {
    server 192.168.0.101:80;
    keepalive 1
}
Server {
    keepalive_timeout 10
}

 

Sub-Domain  제어

참고 블로그 사진

 

가상 호스트 방식으로 두 개의 server를 하나의 웹서버에서 호스팅할 수 있게 해준다.

server {
    listen 80;
    server_name test1.mydomain.com
    location / {
    root /var/www/test1/public_html;
}
server {
    listen 80;
    server_name test2.mydomain.com
    location / {
    root /var/www/test2/public_html;
}

여기서 server_name에는 처리해줄 도메인 또는 IP 주소를 기록해준다.

 

캐싱 처리

참고 블로그 사진

캐싱이란 웹 서비스의 이미지,CSS, 자바스크립트 같은 정적인 데이터를 저장하여,
웹 서비스의 응답 속도를 보다 빠르게 처리 가능하다

  • location : 캐시로 저장할 파일 설정
  • expires : 데이터의 저장 기간 설정
  • expires 1 (m, y) 설정 기간 동안 정적 데이터를 보관하는 설정으로 m은 달 y는 년
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
    expires 1M;
    access_log off;
    add_header Cache-Control "public";
}

 

여기까지 Nginx의 대표적인 기능을 nginx.conf 파일로 구성해보았다.

 

 

 

그렇다면 실제 예제로 한 번 자세히 확인해보자.

worker_processes  1;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  upstream front-server {
    server 127.0.0.1:5000;
    keepalive 100;
  }

  upstream backend-server {
    server 127.0.0.1:8000;
    keepalive 100;
  }

  server {
    listen 80;
    server_name localhost;

    location / {
      proxy_pass http://front-server;

      proxy_set_header HOST $host;
      proxy_set_header Referer $http_referer;
    }

    location /api {
      proxy_pass http://backend-server;

      proxy_set_header HOST $host;
      proxy_set_header Referer $http_referer;
    }

    error_page 500 502 503 504 /50x.html;
    location = 50x.html {
      root /usr/share/nginx/html;
    }
  }
}

 

  • worker_processes & events(worker_connections)
    • 총 1 * 1024 개의 커넥션을 감당할 수 있다.
  • upstream 블록
    • front-server / backend-server
      • upstream 블록은 로드 밸런싱이나 리버스 프록시 설정에서 사용됨
      • server 지시어는 그룹에 포함될 서버의 주소와 포트 지정
      • keepalive 지시어는 upstream 서버에 관한 연결을 얼마나 오래 유지할지를 결정
        • upstream 서버로의 연결을 재사용하기 위해 연결을 열어 둘 최대수를 지정
        • 프록시 서버와 upstream 서버 간에 새로운 연결을 맺는 오버헤드를 줄여줌
  • include /etc/nginx/mime/types
    •  외부 설정 파일을 현재 설정 파일에 포함시킴
    • Nginx가 다양한 파일 타입(MIME 타입)을 인식할 수 있도록 한다.
    • mime.types 파일에는 확장자 별로 해당하는 MIME 타입이 정의되어 있으며, 이를 통해
    • Nginx는 정적 파일을 제공할 때 올바른 Content-Type 헤더를 클라이언트에 전송 가능
  • default_type application/octet-stream
    • default_type 지시어는 MIME 타입이 지정되지 않은 파일을 제공할 때 사용할 기본 Content-Type을 설정
    • application/octet-stream은 일반적으로 알려지지 않은 모든 종류의 이진 데이터에 사용됨
  •  location 블록
    • 특정 URI에 관한 요청을 어떻게 처리할지를 정의
    • proxy_pass 지시어는 요청을 다른 서버로 전달
    • 여기서는 front-server, backend-server로 정의된 upstream 그룹으로 요청 전달
    • proxy_set_header 지시어는 프록시 요청에 헤더를 추가하거나 수정.
      • 여기서는 HOST와 Referer 헤더를 설정
  • error_page 지시어
    • 특정 오류 코드에 관한 응답 페이지를 지정

 

 

 

여기까지 nginx.conf에 대해 알아보았다.

하지만, 이 밖에도 수많은 설정등이 존재한다.