728x90
최근 미팅에 참석하니, 환경상 인프라 3대 이상 사용은 어렵고,
인스턴스 이중화가 아니더라도 Tomcat이라도 무중단이 되었으면 좋겠다고 하였다.
(마치 blue green 처럼...)
생각한 구성은 이랬다.
Instance : WEB-WAS(1ea), DB(1ea)
SW : nginx, tomcat, redis, mysql
Tomcat 1,2 을 두고 톰캣에 auto deploy 설정을 해놓고,
배포가 필요할 때 꺼져있는 톰캣에 war 파일을 업로드해주면 가능할 것 같았다.
Session 저장은 redis에 할 것이기 때문에 크게 신경쓰지 않았다.
Tomcat 2대에 auto deploy 설정해준다.
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
nginx.conf 설정을 해준다.
실제 배포를 해보니 넘어가는 순간 WAS 커넥션이 유실되어 503 에러가 발생하여
fail_timeout과 proxy_next_upstrem을 추가했다.
worker_processes 1;
events { worker_connections 1024; }
http {
upstream backend {
server localhost:8080 max_fails=3 fail_timeout=30s;
server localhost:8180 max_fails=3 fail_timeout=30s;
}
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;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
}
이제 배포 스크립트를 적용하고, 배포 테스트를 해봤다.
민감 정보가 있어 테스트 결과를 첨부하기는 어렵지만 원하는대로 잘 동작하였다.
#!/bin/bash
# 환경 변수 설정
BLUE_PORT=8080
GREEN_PORT=8180
GREEN_PATH="/usr/local/tomcat_green"
BLUE_PATH="/usr/local/tomcat_blue"
NGINX_CONF_DIR="/etc/nginx"
TEST_URL="http://localhost:"
LOG_DIR="/root/script"
DEPLOY_DATE=`date`
# 현재 활성화된 환경을 확인
CURRENT_PORT=$(lsof -i -P -n | grep LISTEN | grep -E ":(8080|8180)" | awk '{print $9}' | cut -d: -f2)
if [ "$CURRENT_PORT" == "$BLUE_PORT" ]; then
ACTIVE="blue"
INACTIVE="green"
INACTIVE_PATH="$GREEN_PATH"
INACTIVE_PORT="$GREEN_PORT"
ACTIVE_PATH="$BLUE_PATH"
else
ACTIVE="green"
INACTIVE="blue"
INACTIVE_PATH="$BLUE_PATH"
INACTIVE_PORT="$BLUE_PORT"
ACTIVE_PATH="$GREEN_PATH"
fi
echo "Currently active environment: $ACTIVE"
echo "Currently inactive environment: $INACTIVE"
# 배포 파일 복사
echo "Copying new application files to $INACTIVE_PATH"
cp /root/ROOT.war "$INACTIVE_PATH/webapps/"
# Green Tomcat 시작
echo "Starting $INACTIVE Tomcat"
echo "Acrive Tomcat $INACTIVE, Deploy Date $DEPLOY_DATE" >> $LOG_DIR/deploy.log
"$INACTIVE_PATH/bin/startup.sh"
# 기동 완료 확인 (test.jsp 호출로 확인)
echo "Waiting for $INACTIVE Tomcat to start..."
TIMEOUT=60
INTERVAL=10
ELAPSED=0
while true; do
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$TEST_URL$INACTIVE_PORT/test.jsp")
if [ "$HTTP_STATUS" == "200" ]; then
break
fi
sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))
if [ $ELAPSED -ge $TIMEOUT ]; then
echo "Error: $INACTIVE Tomcat did not start within $TIMEOUT seconds."
exit 1
fi
done
echo "$INACTIVE Tomcat has started successfully."
sleep 6
# Nginx 재시작
echo "Reloading Nginx"
systemctl reload nginx
# Blue Tomcat 종료
echo "Stopping $ACTIVE Tomcat"
"$ACTIVE_PATH/bin/shutdown.sh"
# Nginx 재시작
#echo "Reloading Nginx"
#systemctl reload nginx
# Tomcat 종료 확인
echo "Waiting for $ACTIVE Tomcat to stop..."
TIMEOUT=30
INTERVAL=3
ELAPSED=0
while lsof -i -P -n | grep -q ":$CURRENT_PORT"; do
sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))
if [ $ELAPSED -ge $TIMEOUT ]; then
echo "Warning: $ACTIVE Tomcat did not stop within $TIMEOUT seconds. Attempting to kill process..."
PID=$(lsof -t -i :$CURRENT_PORT)
kill -9 $PID
sleep 5 # Give some time for the process to be killed
if lsof -i -P -n | grep -q ":$CURRENT_PORT"; then
echo "Error: Failed to kill $ACTIVE Tomcat process on port $CURRENT_PORT."
exit 1
else
echo "$ACTIVE Tomcat process killed successfully."
fi
break
fi
done
echo "$ACTIVE Tomcat has stopped."
echo "Deployment to $INACTIVE environment completed successfully."
배포 로그도 잘 남기는 것 같다.
(이 로그를 남기는 이유는 인스턴스 한대에서 왔다갔다 하기 때문에,
언제 배포가 발생했는지, 이슈 발생 시 트래킹하기가 좋은 기초 데이터로 유용할 것 같아 남기기로 했다.)
Acrive Tomcat green, Deploy Date Wed Jun 19 15:38:40 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 15:42:25 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 15:49:31 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 15:50:07 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 15:51:24 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 15:51:58 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 15:53:19 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 15:53:44 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 15:54:39 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 16:03:27 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 16:08:28 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 16:08:50 KST 2024
Acrive Tomcat green, Deploy Date Wed Jun 19 16:09:28 KST 2024
Acrive Tomcat blue, Deploy Date Wed Jun 19 16:13:20 KST 2024
728x90
'Linux' 카테고리의 다른 글
[KANS] 컨테이너 네트워크 & IPTables (0) | 2024.09.01 |
---|---|
[KANS] 컨테이너 격리 (3) | 2024.08.30 |
[Linux] Symbolic link 안전하게 제거하기 (0) | 2024.07.18 |