본문 바로가기

NginX

nginx 2-2(무중단 배포1/2)

목표: NginX연결하고 프로젝트에 적용시키기

1. 포트를 두개 만들어 주기 (8081 / 8082)

ec2 서버가 아닌 인텔리제이에서 설정을 해준다(application.yml)

spring: profiles: set1 server: port: 8081 management: endpoints: web: exposure: include: "*" --- spring: profiles: set2 server: port: 8082 management: endpoints: web: exposure: include: "*"

2. 포트가 잘 변경이 되는지 확인하기

shift를 두번 눌러 검색창을 띄우고 Edit configurations를 찾습니다.

-프로젝트를 만들때 생성 된 application을 왼쪽 상단에 있는 copy를 눌러 복사를 합니다

-잘 복사 되었는지 확인하고 아래와 같이 Name, Active profiles를 변경 합니다

-application을 실행시켜 포트가 잘 변경 되었는지 확인 합니다
[The following profiles are active: set1]

포트가 잘 변경된 것을 확인 할 수 있습니다.
그럼 이제 NginX를 Ec2에 설치합니다.

3.Ec2에 NginX 설치하기

[ec2에 들어가기]
터미널을 켠다
(리눅스-명령어)
ssh -i [내 컴퓨터에 있는 보안키] ec2-user@[ec2 주소 ip]
(우분투-명령어)
ssh -i [내 컴퓨터에 있는 보안키] ubuntu@[ec2 주소 ip]

[NginX 설치하기]
-설치 명령어
sudo yum install nginx
-실행 명령어
sudo service nginx start
-돌고있는지 확인하는 명령어
ps -ef | grep nginx

4. NginX 설정파일에서 리버스 프록시 설정하기

-nginx.conf을 수정할 수 있게 해주는 명령어
sudo vim /etc/nginx/nginx.conf
server 아래에 있는 location/아래에 추가하기

proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;

5. 배포 스크립트 작성하기

mkdir ~/app/nonstop/springboot-webservice mkdir ~/app/nonstop/springboot-webservice/build mkdir ~/app/nonstop/springboot-webservice/build/libs cp ~/app/travis/build/build/libs/*.jar ~/app/nonstop/springboot-webservice/build/libs/

6. 배포 파일 모아둘 디렉토리 만들기

-디렉토리를 만드는 명령어
mkdir ~/app/nonstop/jar

7.스크립트 파일 만들기

-파일을 수정하게 해주는 명령어
vim ~/app/nonstop/deploy.sh

지난번에 만든 jar 파일을 5번으로 옮기는 스크립트를 작성하고 옮긴 파일로 쉬고 있는 port를 찾아서 배포하는 스크립트를 작성합니다.

BASE_PATH=/home/ec2-user/app/nonstop REPOSITORYSECOND=/home/ec2-user/app/git/*.jar echo "> build 파일 복사1" cp $REPOSITORYSECOND $BASE_PATH/springboot-webservice/build/libs/ BUILD_PATH=$(ls $BASE_PATH/springboot-webservice/build/libs/*.jar) JAR_NAME=$(basename $BUILD_PATH) echo "> build 파일명: $JAR_NAME" echo "> build 파일 복사" DEPLOY_PATH=$BASE_PATH/jar/ cp $BUILD_PATH $DEPLOY_PATH echo "> 현재 구동중인 Set 확인" CURRENT_PROFILE=$(curl -s http://localhost/profile) echo "> $CURRENT_PROFILE" # 쉬고 있는 set 찾기: set1이 사용중이면 set2가 쉬고 있고, 반대면 set1이 쉬고 있음 if [ $CURRENT_PROFILE == set1 ] then IDLE_PROFILE=set2 IDLE_PORT=8082 elif [ $CURRENT_PROFILE == set2 ] then IDLE_PROFILE=set1 IDLE_PORT=8081 else echo "> 일치하는 Profile이 없습니다. Profile: $CURRENT_PROFILE" echo "> set1을 할당합니다. IDLE_PROFILE: set1" IDLE_PROFILE=set1 IDLE_PORT=8081 fi echo "> application.jar 교체" IDLE_APPLICATION=$IDLE_PROFILE-bookback.jar IDLE_APPLICATION_PATH=$DEPLOY_PATH$IDLE_APPLICATION ln -Tfs $DEPLOY_PATH$JAR_NAME $IDLE_APPLICATION_PATH echo "> $IDLE_PROFILE 에서 구동중인 애플리케이션 pid 확인" IDLE_PID=$(pgrep -f $IDLE_APPLICATION) if [ -z $IDLE_PID ] then echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." else echo "> kill -15 $IDLE_PID" kill -15 $IDLE_PID sleep 5 fi echo "> $IDLE_PROFILE 배포" nohup java -jar -Dspring.profiles.active=$IDLE_PROFILE $IDLE_APPLICATION_PATH & echo "> $IDLE_PROFILE 10초 후 Health check 시작" echo "> curl -s http://localhost:$IDLE_PORT/profile " sleep 10 for retry_count in {1..10} do response=$(curl -s http://localhost:$IDLE_PORT/profile) up_count=$(echo $response | grep 'set' | wc -l) if [ $up_count -ge 1 ] then # $up_count >= 1 ("set" 문자열이 있는지 검증) echo "> Health check 성공" break else echo "> Health check의 응답을 알 수 없거나 혹은 status가 set이 아닙니다." echo "> Health check: ${response}" fi if [ $retry_count -eq 10 ] then echo "> Health check 실패. " echo "> Nginx에 연결하지 않고 배포를 종료합니다." exit 1 fi echo "> Health check 연결 실패. 재시도..." sleep 10 done 

작성을 다 했으면 esc키를 누르고 :wq 를 눌러 스크립트 작성을 끝냅니다

그리고 ~/app/nonstop/deploy.sh 를 실행합니다

8.Nginx 동적 프록시 설정

-nginx.conf를 수정하는 명령어
sudo vim /etc/nginx/nginx.conf
service-url.inc를 include(import)하여 파일 내용 사용이 가능해집니다.

include /etc/nginx/conf.d/service-url.inc; location / { proxy_pass $service_url; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;

9. 스크립트 파일 만들기

-service-url.inc 파일 만들기
sudo vim /etc/nginx/conf.d/service-url.inc

-파일 안에 내용을 작성합니다
set $service_url http://127.0.0.1:8081;

10. NginX config 내용 변경을 적용 시키기 위해 재시작

sudo service nginx restart

-적용이 잘 되었는지 확인하기
curl -s localhost/profile

[ec2 앞에 set1이 나오면 적용이 잘 된 것 입니다.]

[ec2-user@************** nonstop]$ curl -s localhost/profile set1[ec2-user@ip-172-31-36-156 nonstop]$

11. NginX를 배포 시점에 바라보는 Profile을 자동으로 변경하는 스크립트 작성

-작성하는 파일 만드는 명령어
vim ~/app/nonstop/switch.sh
-switch 스크립트 파일 만들기

#!/bin/bash echo "> 현재 구동중인 Port 확인" CURRENT_PROFILE=$(curl -s http://localhost/profile) # 쉬고 있는 set 찾기: set1이 사용중이면 set2가 쉬고 있고, 반대면 set1이 쉬고 있음 if [ $CURRENT_PROFILE == set1 ] then IDLE_PORT=8082 elif [ $CURRENT_PROFILE == set2 ] then IDLE_PORT=8081 else echo "> 일치하는 Profile이 없습니다. Profile: $CURRENT_PROFILE" echo "> 8081을 할당합니다." IDLE_PORT=8081 fi echo "> 전환할 Port: $IDLE_PORT" echo "> Port 전환" echo "set \$service_url http://127.0.0.1:${IDLE_PORT};" |sudo tee /etc/nginx/conf.d/service-url.inc PROXY_PORT=$(curl -s http://localhost/profile) echo "> Nginx Current Proxy Port: $PROXY_PORT" echo "> Nginx Reload" sudo service nginx reload

작성을 다 하셨으면 esc키를 누르고 :wq 로 작성을 마무리 합니다

-switch.sh에 실행 권한을 줍니다
chmod +x ~/app/nonstop/switch.sh

[스크립트가 잘 작성이 되었는지 테스트 하기]
-set2도 실행 시키기
~/app/nonstop/deploy.sh

-switch.sh가 잘 작동하는지 확인하기
~/app/nonstop/switch.sh
+작동시키기 전에 브라우저에서 <내 ip/profile>를 치고 명령어를 작동시킨뒤 새로고침을 눌러보세요
그럼 포트가 변경되는 것을 확인 할 수 있습니다

11. switch 와 deploy스크립트 파일 합치기

vim ~/app/nonstop/deploy.sh

echo "> 스위칭" sleep 10 /home/ec2-user/app/nonstop/switch.sh


12.잘 작동하는지 최종 확인
~/app/nonstop/deploy.sh

저는 ~/app/git/deploy.sh. 과 ~/app/nonstop/deploy.sh 두개를 사용하면 배포를 합니다 그래서 사실 이름도 1/2 무중단 배포 입니다.ㅎㅎ 왜냐하면 테스트 코드를 작성하지 않았고 travis에 연결을 시키지 않았기 때문에 깃헙에 연결을 시켜 놓았다고 하더라도 push를 할때 서버에서 풀을 받지 못합니다. 스크립트를 하나로 합치지 않은 이유는 테스트를 하는 도중에 깃헙에서 pull을 받고 빌드를 할때 실패가 될때가 있어 중간 필터가 없는 상태에서 스크립트를 하나로 합치면 위험할 것 같다는 생각이 들어서 일단은 수동으로 파일을 빌드하여 파일을 배포합니다ㅎㅎ 일단 nginx는 이정도로 마무리를 하려고 합니다. 시간이 남는다면 나중에 travis도 연결을 시켜보려고 합니다. 참고로 nginx시리즈는 기록용입니다.

[많이 참고한 자료 - 감사합니다]
https://jojoldu.tistory.com/267

'NginX' 카테고리의 다른 글

[NginX] 무중단 배포를 적용하던 중 겪은 문제들  (0) 2021.05.30
NginX reverse proxy 설정하기  (0) 2021.05.23