리눅스/Spring 무중단 배포 후기

SeungTaek·2022년 8월 15일
2
post-thumbnail

아래 블로그를 통해 리눅스 환경에서 spring server을 무중단 배포하는 기술을 적용해봤다. 너무 친절하게 포스팅이 되어 있어서, 따라하는데 큰 어려움은 없었다.

https://wbluke.tistory.com/39?category=418851


내가 해당 작업을 진행하면서 만난 문제점들과 해결방법을 기록하기 위해 해당 포스터를 작성한다.

1. Nginx 설치

분명 패키지 목록에는 nginx가 설치되어 있는데, 디렉터리를 아무리 찾아도 /etc/nginx/nginx.conf를 찾지 못했다. 리눅스 서버에서 nginx와 관련된 폴더 및 설정 파일까지 모두 삭제했다가, apt-get으로 재설치하니 .conf파일을 찾을 수 있었다.

설정 파일을 찾을 수 없는 경우에는 아래 명령어를 통해 관련 파일까지 모두 삭제 후 재설치해보자.

sudo apt-get remove nginx nginx-common # config files을 제외하고 삭제
sudo apt-get purge nginx nginx-common # 전체다 삭제
sudo apt-get autoremove #종속성 관련 페키지 삭제
rm -rf /etc/nginx

2. nginx 설정 파일을 수정할 때는 nginx.conf에서 작업하지 않는다.

위에 링크한 블로그에서는 /etc/nginx/nginx.conf 에 스크립트를 추가한다.
하지만 OS나 nginx 버전에 따라서 수정해야 할 파일이 다르다. /etc/nginx/nginx.conf 또는 /etc/nginx/sites-enabled/default에 아래와 같이 스크립트를 추가하자.

...

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        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;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

	...

3. 파일명.jar과 파일명-plain.jar은 다르다.

스프링부트 grade 플로그인 2.5 버전 부터는 gradle 필드 시 JAR 파일이 2개 생성된다.

  1. 프로젝트이름-버전.jar
  2. 프로젝트이름-버전-plain.jar : gradle의 "jar" task로 생성됨. 어플리케이션 실행에 필요한 모든 의존성을 포함하지 않는다.

스크립트 명령어나 직접실행할 때 java -jar ..{생략}../build/libs/*과 같이 하면, ~-plain.jar이 실행될 수도 있다. 의존성 파일을 포함하지 않는 실행 파일이므로, java -jar 명령어로 실행 시 에러가 발생한다.

해결 방법은 2가지이다. gradle에서 plain.jar 생성 방지 코드를 넣던가, 아예 명령어를 명확하게 넣던가.

1. gradle에서 생성 방지 코드 넣기

/*
	build.gradle
*/
jar {
	enabled = false
}

2. 파일명 정보를 더욱 명확하게 명시

java -jar ..{생략}../build/libs/*SNAPSHOT.jar


4. 스크립트 파일을 무작정 복붙하지 말자

물론 큰 들의 코드들은 맞지만, 짜잘하게 디렉터리명 등이 나에게 맞게 세팅해야 한다. 명령어 자체가 어렵지 않으니, 반드시 모든 라인을 이해하자.

블로그에 있는 3개의 스크립트 파일들이 역할은 다음과 같다.

  1. Run_new_was.sh : 현재 실행중인 포트와 다른 포트로 새로 배포한 spring server을 실행하게 해준다.
  2. Health_check.sh : 방금 배포한 서버가 잘 실행되었는지 확인
  3. Switch.sh : nginx의 설정 파일을 수정(포트 변경) 후 nginx reload(reload는 중단안됨)

5. 무언가 꼬인것 같은 느낌이 든다면 Nginx를 재시작하자

필자는 말하는 감자 학부생이므로 nginx를 깊이 알지못한다. 에러 로그만 보고 모든 문제를 해결할 능력이 없다. 따라서 에러가 생기면 아래 명령어를 통해서 점검 및 nginx를 재시작해주자.

  1. nginx -t -c /etc/nginx/nginx.conf : nginx의 설정 파일을 테스트할 수 있다.

  2. sudo service nginx restart : 서비스 재시작

  3. systemctl status nginx.service : 오류로 인해 재시작이 되지 않는다면, 이 명령어로 로그를 확인해보자

  4. sudo service nginx status : 현재 서비스가 어떤 상태인지 확인하자

  5. sudo lsof -i :5555: 특정 포트 확인하기


6. Appspec.yml을 나에게 맞게 변경하자

4번과 비슷한 맥락이다. 블로그 내용을 필자처럼 아무 생각없이 복붙만 한다면 에러만 뿜어낸다. 파일 내용을 내 상황에 맞게 바꿔주자. 예를 들면 permissions.ower 또는 permissions.group 등은 내 리눅스 서버 상황에 맞게 바꿔야 한다.



결론

선하신 많은 분의 블로그 덕분에, 다양한 기술을 습득하고 적용하는 데 큰 어려움 없이 진행할 수 있었다. 하지만 무식하게 블로그 내용을 복붙하면 안된다. 왜 그런 코드가 짜였는지, 왜 이런 행위를 해야 하는지 등을 이해해야 한다. 그래야 오류 상황에서 대처할 수 있다. 착하신 기술 공유자분들이 수저에 밥까지 올려줬으면, 내가 알아서 떠먹자.



Reference

https://wbluke.tistory.com/39?category=418851

https://dazbee.tistory.com/94

https://dev-j.tistory.com/22

profile
I Think So!

0개의 댓글