고가용성 웹 서버 구축은 현대 애플리케이션에서 필수적인 요소입니다. 오늘은 Nginx를 사용하여 고가용성을 제공하는 웹 서버를 설정하는 간단한 미니 프로젝트를 진행해보겠습니다. 이 프로젝트는 두 개의 Nginx 인스턴스를 로드밸런싱하여 장애 조치(failover) 및 부하 분산(load balancing)을 구현하는 데 중점을 둡니다.

프로젝트 진행 환경

이번 프로젝트에서는 다음과 같은 환경을 설정할 것입니다.

  • 운영 체제: Ubuntu 20.04 LTS
  • 웹 서버: Nginx
  • 로드밸런서: Nginx
  • 서버 수: 2대의 Nginx 서버와 1대의 로드밸런서

각 서버는 서로 다른 IP 주소를 가질 것이며, 로드밸런서는 클라이언트의 요청을 두 개의 Nginx 서버에 분산합니다. 이를 통해 하나의 서버에 장애가 발생하더라도 서비스가 계속 제공될 수 있도록 합니다.

서버 준비

  1. 서버 설치
  2. 각 서버에 SSH로 접속한 후, Nginx를 설치합니다.

       sudo apt update
       sudo apt install nginx -y
  3. Nginx 웹 페이지 설정
  4. 서버의 기본 HTML 파일을 수정하여 각 Nginx 서버에서 다른 내용을 표시하도록 합니다.

    - 서버 1 (IP: 192.168.1.101)

       echo "<h1>Server 1 - Healthy</h1>" | sudo tee /var/www/html/index.html

    - 서버 2 (IP: 192.168.1.102)

       echo "<h1>Server 2 - Healthy</h1>" | sudo tee /var/www/html/index.html

    로드밸런서 설정

  5. 로드밸런서 Nginx 설정
  6. 로드밸런서 역할을 할 Nginx 서버에 접속하여 설정 파일을 수정합니다.

       sudo nano /etc/nginx/sites-available/default

    기본 설정 파일을 다음과 같이 수정합니다.

       upstream backend {
           server 192.168.1.101;
           server 192.168.1.102;
       }
    
       server {
           listen 80;
    
           location / {
               proxy_pass http://backend;
               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;
           }
       }

    위의 설정에서 upstream 블록은 두 개의 Nginx 서버를 정의하고, proxy_pass 지시어는 클라이언트의 요청을 이 서버들로 분산합니다.

  7. Nginx 재시작
  8. 설정 변경 후, Nginx를 재시작하여 변경사항을 적용합니다.

       sudo systemctl restart nginx

    모니터링 설정

    고가용성을 보장하기 위해 각 서버의 상태를 모니터링할 수 있는 도구를 설정하는 것이 중요합니다. 여기서는 간단한 curl 명령어를 사용하여 서버의 상태를 확인하는 방법을 소개합니다.

  9. 각 서버의 상태를 확인하는 스크립트를 작성합니다.
  10.    #!/bin/bash
    
       SERVER_1="http://192.168.1.101"
       SERVER_2="http://192.168.1.102"
    
       for SERVER in $SERVER_1 $SERVER_2; do
           HTTP_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $SERVER)
           if [ $HTTP_RESPONSE -eq 200 ]; then
               echo "$SERVER is up"
           else
               echo "$SERVER is down"
           fi
       done

    이 스크립트는 각 서버의 HTTP 상태 코드를 확인하고, 서버가 정상인지 여부를 출력합니다.

  11. 스크립트를 실행 가능한 상태로 만들고 주기적으로 실행하도록 설정합니다.
   chmod +x check_servers.sh

이후 cron을 사용하여 주기적으로 이 스크립트를 실행할 수 있습니다.

   crontab -e

다음 줄을 추가하여 5분마다 스크립트를 실행하도록 설정합니다.

   /5    * /path/to/check_servers.sh >> /path/to/logfile.log

마무리

이번 포스트에서는 Nginx를 활용하여 고가용성 웹 서버를 구축하는 방법을 살펴보았습니다. 로드밸런서를 설정하고, 각 서버의 상태를 모니터링하는 방법까지 알아보았습니다. 이러한 설정을 통해 서비스의 지속성을 높이고, 장애 발생 시 신속하게 대처할 수 있는 시스템을 구축할 수 있습니다. 여러분의 프로젝트에 많은 도움이 되기를 바랍니다.