오늘도 개발자 Backend Developer

NGINX 활용한 무중단 배포! 자동화 삽질기.

  • 개인 프로젝트에서 nginx를 웹서버로 사용하고 있다. 그 뒤에는 2대의 WAS를 사용하고 있고, nginx upstream 기능을 사용하여 로드 밸런싱을 했다. 그러다 보니 배포시에 아래 upstream 내 server를 주석처리하고 nginx 를 reload 하고 다 배포하고 또 주석 처리하고 nginx reload하고…. 다 처리하고 다시 reload하고… 휴…. 반복 해야 한다.

  • upstream.conf

upstream project_was {
    least_conn;
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8080 weight=1;
}
  • 생각보다 이 작업이 시간도 많이 걸리고 사람이 작업을 하다 보니, 실수가 종종 나오곤 했다. 좋은 방법이 없나 고민을 하기 시작했다!

매일 반복적으로 처리하는 업무의 경우, 최대한 자동화를 진행해야 보다 쾌적한 하루를 보낼 수 있다.

1. 해결해보자.

  • Nginx Plus를 구매!
  • https://www.nginx.com/pricing
  • 비싸다…….

2. Nginx Upstream 파일을 만들자!

위 upstream.conf 파일도 어찌 보면 단순 텍스트 파일이다.

  • 배포할 서버를 제외하고 Argument로 활성화 시킬 서버를 넣고 위 파일을 새롭게 생성한다.
Argument
USE_HOST_INFO_STR=$1
파일 생성
HOSTS=(${USE_HOST_INFO_STR//,/' '})

SERVER_TEXT_TMPL='server HOST weight=1;'
UPSTM_NM_TEXT_TMPL='upstream UPSTM_NM '

UPSTM_NM="tmp_upstream"
BASIC_NGINX_CONF_PATH="/etc/nginx/"
UPSTREAM_CONF_FILE_NM=$UPSTM_NM".conf"

RTN_CONF_STR="${UPSTM_NM_TEXT_TMPL/UPSTM_NM/$UPSTM_NM} { \n"
RTN_CONF_STR+=" least_conn; \n "
for host in ${HOSTS[@]}
do
RTN_CONF_STR+="${SERVER_TEXT_TMPL/HOST/$host} \n"
done
RTN_CONF_STR+="} \n"

echo -e $RTN_CONF_STR > $BASIC_NGINX_CONF_PATH$UPSTREAM_CONF_FILE_NM

3. nginx -t 명령어로 conf파일 valid 체크를 한다.

  • 잘못된 내용이 들어갈 경우를 대비한 로직이다.
if nginx -t ; then
    echo "=======OK========"
    systemctl reload  nginx.service
else
    echo "=======ERROR========"
    exit -1;
fi

4. 전체파일

#!/bin/sh

USE_HOST_INFO_STR=$1

function create_conf_file
{
    HOSTS=(${USE_HOST_INFO_STR//,/' '})

    SERVER_TEXT_TMPL='server HOST weight=1;'
    UPSTM_NM_TEXT_TMPL='upstream UPSTM_NM '

    UPSTM_NM="tmp_upstream"
    BASIC_NGINX_CONF_PATH="/etc/nginx/"
    UPSTREAM_CONF_FILE_NM=$UPSTM_NM".conf"

    RTN_CONF_STR="${UPSTM_NM_TEXT_TMPL/UPSTM_NM/$UPSTM_NM} { \n"
    RTN_CONF_STR+=" least_conn; \n "
    for host in ${HOSTS[@]}
    do
    RTN_CONF_STR+="${SERVER_TEXT_TMPL/HOST/$host} \n"
    done
    RTN_CONF_STR+="} \n"

    echo -e $RTN_CONF_STR > $BASIC_NGINX_CONF_PATH$UPSTREAM_CONF_FILE_NM
}

function valid_check
{
    if nginx -t ; then
        echo "=======OK========"
        systemctl reload  nginx.service
    else
        echo "=======ERROR========"
        exit -1;
    fi
}

create_conf_file
valid_check

5. 느낀점

  • 위 작업을 하면서 쉘 스크립트 작성은 오래 걸리지 않았다. 그러나 프로젝트를 진행하면서 배포를 자동화 해 놓으니 너무 너무 편했다.

6. 결론!

  • 반복적인 작업을 자동화하는 습관이 필요하다.
  • 조금만 머리를 쓰면 몸이 편하다!
  • 한번 배포할 때 30초에서 1분 정도 소비되던 반복 작업을 빼니, 좀 더 프로젝트에 집중 할 수 있었다.

** 참고로 위에 스크립트를 업무에 가져다 쓰실 경우 sleep을 충분히 주시기 바랍니다. ^_^ **