Azure DevOps Pipeline 구성을 통한 NGINX 관리 가이드

이 포스트에서는 Azure DevOps 프로젝트의 Azure DevOps Pipeline 구성을 통해 NGINX의 구성 및 배포를 자동화하도록 구성하는 방법에 관해 다룹니다.

Pipeline을 실행할 Azure agent VM과 설정을 적용할 NGINX VM 설정 방법, pipeline 코드의 예시 및 작동 과정에 대해 다루며, 이전 단계인 Azure DevOps 프로젝트 구성을 통해 GitHub와 연동하고, Azure agent를 설치하는 방법은 이전 포스트인 Azure DevOps 프로젝트 – NGINX 구성/배포 자동화 구성 방법 포스트를 참고하세요.

목차

1. GitHub 리포지토리 구성
2. Azure agent VM, NGINX VM 설정
3. Azure DevOps Pipeline 생성
4. Azure DevOps Pipeline테스트
5. 결론

1. GitHub 리포지토리 구성

지난 포스트에서 연동한 GitHub 리포지토리에 NGINX 설정 파일을 미리 구성했습니다.

위와 같이 NGINX 디렉토리 하위에 nginx.conf 파일과 conf.d 디렉토리, conf.d 디렉토리 하위에는 default.conf 파일을 구성했습니다.

2. Azure agent VM, NGINX VM 설정

이 포스트에서 다루는 Pipeline은 Azure agent VM을 통해서 GitHub 리포지토리의 NGINX 설정 파일을 NGINX VM으로 전송하고, 적용하는 방식으로 동작합니다. 해당 과정을 수행하기 위해 Azure agent VM이 NGINX VM으로 ssh 접속을 할 수 있도록 설정하고, NGINX VM의 명령어 실행을 위해 sudoers 파일을 설정하겠습니다.

1. Azure agent VM 서버에서 SSH 키를 생성합니다.

$ ssh-keygen -t rsa -b 4096 -C

위 명령어를 사용하면 ~/.ssh/ 디렉토리에 개인 키(id_rsa)와 공개키(id_rsa.pub) 파일이 생성됩니다.

2. 생성한 SSH 공개 키를 Azure agent VM에서 NGINX VM으로 복사합니다.

$ ssh-copy-id nginx@192.168.201.151

예제 명령어의 nginx는 NGINX VM의 사용자 이름, 192.168.201.151 IP는 NGINX 서버의 IP 주소입니다.

3. Azure agent VM에서 NGINX VM으로 비밀번호 없이 SSH 접속 가능 여부를 확인합니다.

$ ssh nginx@192.168.201.151

4. NGINX VM 서버에서 다음 명령어를 통해 비밀번호 없이 sudo 명령을 사용하도록 설정합니다.

$ sudo visudo

파일의 하단에 다음 내용을 추가합니다.

nginx   ALL=(ALL) NOPASSWD: /usr/bin/cp, /usr/bin/rm, /usr/sbin/nginx
  • nginx: NGINX VM 서버의 사용자 이름입니다.
  • /usr/bin/cp: 복사한 GitHub 리포지토리의 파일을 복사하기 위해 설정합니다.
  • /usr/bin/rm: 복사하기 전 기존의 conf 파일을 삭제하기 위해 설정합니다.
  • /usr/sbin/nginx: 파일을 적용하기 전 nginx -t 명령어를 통한 문법 테스트, 파일 적용 후 nginx -s reload 명령어를 사용하기 위해 설정합니다.

5. NGINX VM에서 설정의 적용을 확인합니다.

$ sudo nginx -t

명령어 사용 시 비밀번호 입력 없이 실행되는 것을 확인합니다.

3. Azure DevOps Pipeline 생성

예시 코드를 통해 Pipeline을 생성합니다.

1. Azure DevOps 프로젝트 좌측 Pipelines 메뉴에서 New pipeline 버튼으로 새로운 Pipeline을 생성합니다.

Azure DevOps Pipeline new pipeline

2. GitHub를 연동한 경우 GitHub를 선택합니다.

Azure DevOps Pipeline Connect

연동 방법은 이전 포스트인 Azure DevOps 프로젝트 – NGINX 구성/배포 자동화 구성 방법 포스트를 참고하세요.

3. 리포지토리를 선택합니다.

Azure DevOps Pipeline Select repository

4. Pipeline을 구성합니다.

trigger:
# main 브랜치에서 변경 사항이 있을 때 pipeline을 자동으로 트리거
- main

pool:
# pipeline을 트리거할 pool 설정.
  name: Azure Agent

jobs:
  - job: UpdateNGINX
    steps:
      # 현재 리포지토리의 코드를 체크아웃하여 Azure Agent가 pipeline 작업에 사용할 수 있도록 설정
      - checkout: self

      # Azure DevOps에서 제공하는 Bash 작업을 사용
      - task: Bash@3
        inputs:
          # Bash 스크립트를 파이프라인 YAML 파일 내에 직접 작성하고 실행
          targetType: 'inline'
          # 실행할 스크립트 내용 
          script: |
            # NGINX 설정 파일 전송
            # SSH 접속 대상(nginx@192.168.201.151) 및 디렉토리(/home/nginx) 환경에 맞게 수정
            ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no nginx@192.168.201.151 "mkdir -p /home/nginx/temp_conf.d"
            # GitHub 리포지토리에서 복사할 경로($(Build.SourcesDirectory)/NGINX/conf.d/) 환경에 맞게 수정
            scp -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -r $(Build.SourcesDirectory)/NGINX/conf.d/* nginx@192.168.201.151:/home/nginx/temp_conf.d/
            scp -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $(Build.SourcesDirectory)/NGINX/nginx.conf nginx@192.168.201.151:/home/nginx/temp_nginx.conf

            # 원격 서버에서 파일 복사 및 NGINX 재시작
            ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no nginx@192.168.201.151 << 'ENDSSH'
              # 기존 설정 파일 백업
              mkdir -p /home/nginx/backups
              sudo cp -r /etc/nginx/conf.d /home/nginx/backups/conf.d.bak
              sudo cp /etc/nginx/nginx.conf /home/nginx/backups/nginx.conf.bak

              # 기존 conf.d 내의 파일 삭제
              sudo rm -rf /etc/nginx/conf.d/*
  
              # 새로운 설정 파일 복사
              sudo cp -r /home/nginx/temp_conf.d/* /etc/nginx/conf.d/
              sudo cp /home/nginx/temp_nginx.conf /etc/nginx/nginx.conf

              # nginx -t 명령어를 통한 파일 검사
              if ! sudo nginx -t; then
                echo "NGINX configuration test failed"
                echo "Rolling back to previous configuration..."
                
                # conf.d 디렉토리 비우기
                sudo rm -rf /etc/nginx/conf.d/*

                # 백업 파일 재적용
                sudo cp -r /home/nginx/backups/conf.d.bak/* /etc/nginx/conf.d/
                sudo cp /home/nginx/backups/nginx.conf.bak /etc/nginx/nginx.conf
                exit 1
              else
                echo "NGINX configuration test passed. Reloading NGINX..."
                sudo nginx -s reload
                echo "NGINX configuration updated successfully"
              fi

              # 백업 및 임시 파일 제거
              rm -rf /home/nginx/temp_conf.d
              rm /home/nginx/temp_nginx.conf
              sudo rm -rf /home/nginx/backups
            ENDSSH

        displayName: 'Update NGINX Configuration'

위 스크립트는 다음과 같은 과정으로 실행됩니다.

  1. Azure agent VM이 NGINX VM에 SSH 접속을 통해 GitHub 리포지토리의 파일을 사용자 디렉토리에 temp 파일로 복사합니다.
  2. 기존에 NGINX VM에 존재하던 conf 파일을 사용자 디렉토리의 backups 디렉토리에 복사합니다.
  3. 기존의 conf 파일을 삭제하고, temp 파일(GitHub 리포지토리 파일)을 /etc/nginx 디렉토리에 복사합니다.
  4. nginx -t 명령어를 통해 새로 복사된 파일을 검사하고, 에러 발생 시 2번 과정에서 복사한 backup 파일로 원복시키고, exit 1을 통해 pipeline을 종료합니다.
  5. nginx -t 명령어를 통해 파일 검사에 성공하면, nginx -s reload 명령어를 통해 새로운 파일을 적용하고, 백업파일 및 temp 파일을 제거합니다.

5. Save and run 버튼을 통해 Pipeline을 저장하고 실행합니다.

Azure DevOps Pipeline Save and run
Azure DevOps Pipeline 실행 설정

아래와 같이 권한 문제가 발생한다면, Agent pool에서 Pipeline 권한 설정을 합니다.
설정 방법은 이전 포스트인 Azure DevOps 프로젝트 – NGINX 구성/배포 자동화 구성 방법 포스트를 참고하세요.
혹은 View 버튼을 통해 간편하게 설정할 수 있습니다.

6. Pipeline 실행 성공 여부를 확인합니다.

Azure DevOps Pipeline 결과

에러 발생 시 하단의 에러 항목을 확인하여 아래와 같이 에러 메시지를 확인할 수 있습니다.

Azure DevOps Pipeline 에러
Azure DevOps Pipeline 에러 메시지

4. Azure DevOps Pipeline 테스트

GitHub 리포지토리에 새로운 NGINX 설정 파일을 push하고, Azure DevOps Pipeline이 동작하여 NGINX 서버에 설정이 적용되는 것을 확인하겠습니다. 이 포스트에서는 GitHub Desktop을 사용했습니다.

1. 새로운 NGINX의 설정 파일인 test.conf 파일을 NGINX/conf.d 디렉토리에 추가합니다.

server {
    listen       8081;

    location / {
        add_header Content-Type text/plain;
        return 200 "pipeline test";
    }

}

8081 포트를 통해 연결할 수 있고, 텍스트를 반환하는 간단한 서버입니다.

2. 새로 추가한 파일을 GitHub 리포지토리에 push 합니다.

3. GitHub에서 상태를 확인합니다.

최초 pending 상태를 확인할 수 있습니다.

Pipeline 작동 완료 시 다음과 같은 상태를 확인할 수 있습니다.

Azure DevOps Pipeline 성공
Azure DevOps Pipeline 성공

4. Azure DevOps Pipeline에서 성공을 확인합니다.

main 브랜치의 변경으로 인해 트리거되어, Individual CI for 로 나타나는 것을 확인할 수 있습니다.

5. NGINX VM 서버에 새로 추가한 설정 파일의 적용을 확인합니다.

새로 추가한 test.conf 파일을 확인할 수 있습니다.

8081 포트를 통해 접속 시 test.conf 파일 구성에 맞는 텍스트 응답을 확인할 수 있습니다.

6. NGINX 구문 오류가 있는 test2.conf 파일을 추가합니다.

server {
    listen       8082;

    location / {
        add_header Content-Type text/plain;
        return 200 "pipeline test2";

server, location 블록을 닫는 } 중괄호가 없어, 구문 오류가 발생합니다.

7. 새로운 파일을 push 후 확인합니다.

Azure DevOps Pipeline 실패
Azure DevOps Pipeline 실패

GitHub 리포지토리에 신규 파일의 push는 성공했으나, Pipeline은 실패했음을 확인할 수 있습니다.

8. Azure DevOps Pipeline에서 실패를 확인합니다.

구문 오류를 확인할 수 있습니다.

9. NGINX VM 서버를 확인합니다.

Pipeline 설정에 따라, 에러가 발생하는 신규 설정 파일을 적용하지 않고, 백업해 둔 기존의 설정 파일을 복원합니다.

5. 결론

이번 포스트에서는 Azure DevOps Pipeline 구성을 통해 NGINX의 구성 및 배포를 자동화하도록 구성하는 방법에 대해 알아봤습니다. Azure agent VM과 NGINX VM을 설정하는 방법과, 예시 Pipeline 코드를 적용하여 Pipeline을 구성했습니다.
또한, 연동한 GitHub 리포지토리의 main 브랜치의 변경 사항을 감지하고, 새로 추가된 NGINX의 설정 파일에 따라 Pipeline이 동작하는 과정을 직접 살펴봤습니다.

Azure DevOps Pipeline과 NGINX를 통합하여 관리할 경우, 배포를 자동화 할 수 있고 설정 파일의 변경 이력을 체계적으로 관리 및 이전 버전으로 쉽게 롤백할 수 있어 보다 안정적인 운영이 가능합니다.

NGINX OSS보다 향상된 NGINX Plus를 Azure Pipeline과 통합해 구성 및 배포 자동화를 경험해보고 싶다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required