이번 팀프로젝트를 진행하면서 서버쪽 관리와 Nginx를 사용한 무중단 배포 및 Https 연결을 맡았다.
개인프로젝트를 진행하면서 코드와 Swagger 작업만 마친채로 항상 그쳤었는데 이번에 서버 관리쪽을 맡으면서 정말 많은 것을 깨달았고, 이제 혼자서도 배포를 할 수 있을 정도로 Linux를 활용한 기본적인 명령어도 숙지할 수 있는, 한단계 업그레이드 할 수 있는 좋은 기회였다.
이번 팀프로젝트를 진행하면서 배운 기술들과 이슈 관련해서 천천히 정리해서 포스팅 해보려 한다.
Nginx
이번에 팀프로젝트를 하면서 Nginx를 적용한 이유는 무중단 배포를 경험해보고 싶었던 이유가 가장 크기도 하다.
Nginx의 가장 큰 특징중 하나인 리버스 프록시라는 특징을 이용하면 데이터를 요청하는 클라이언트는 백엔드 서버가 아닌 Nginx를 통해 요청을 하게 된다.
Nginx를 통해 요청이 들어오니 클라이언트 쪽에서는 오로지 Nginx의 포트만 알고있으면 되는데, 이는 네트워크의 기본 포트인 80포트로 설정해놓고 80포트로 요청이 들어오면 스프링 서버 쪽으로 (8080 or 8081)로 요청을 보내게 하는 구조이다.
이를 통해 현재 활성화 되어있는 스프링 서버 쪽으로 8080 or 8081로 보낼 수 있게 된다.
여기서 리버스 프록시라는 특징을 이용해서 https를 적용해놓고 모든 요청이 Nginx로 들어올 때 https를 적용시켜서 리다이렉트 8080 or 8081 포트로 보내는 구조를 갖게 된다.
이 때 ssl(443(https))을 적용시키기 위해서는 일종의 키를 받아야 하는데 이는 certbot을 사용해주면 자동으로 키를 생성시켜준다.
Certbot
Certbot에 대한 내용은 구글링을 해보면 다양한 정보글이 나오니 해당 글을 참고하자.
먼저 이를 이용하기 위해서는 가비아에서 도메인을 구입해줘야 한다. 도메인을 구입해주고 설정하면 되는데, 여기서 사용된 서버는 AWS EC2 서버를 이용했다.
그리고 현재 우리 서버 인프라 구성은 EC2 서버는 프리티어를 이용했다 메모리가 1GB가 밖에 되지 않는다. 그래서 내가 택한 방법은 Nginx 인스턴스를 따로 생성하는 것이 아닌 EC2 인스턴스 내부에 도커를 깔고 도커의 이미지로 Nginx 이미지를 땡겨와서 실행시키는 구조로 방향을 잡았다.
Certbot을 적용 시키기 위해서는 우분투 서버로 들어와서(도커 내부의 Nginx가 아니다)
sudo apt-get update
sudo apt-get install python3-certbot-nginx
<이 때 80포트를 종료를해줘야 하는데 docker에서 nginx를 꺼준다>
certbot --standalone -d 본인 도메인 -d www.plist.shop certonly -> 도메인 이름을 입력해준다
certbot --standalone -d 본인 도메인 -d www.plist.shop certonly 여기서 -d 명령어 뒤에 가비아에서 적용시킨 도메인 이름을 적용시켜 주면 되는데 우리 프로젝트의 도메인은 plist.shop이다. 가비아 도메인에 적용시킨 이름이 많다면 -d 도메인 (한칸 뛰고) -d 도메인 -d 도메인... 이런식으로 적용시켜주면 된다.
해당 작업을 하기전에 Nginx 서버를 잠시 꺼둬야 한다. Certbot이 80포트를 이용해서 키를 생성하기 때문이다.
명령어를 실행시키면 키를 생성해주는데 어떠한 질문들을 받게 된다.
첫번째 질문이 키의 유효기간 임박시 메일을 받을 이메일 주소를 입력하게 된다. Certbot을 통한 ssl 키의 유효기간은 3개월이다.
2번째 부터 대충 y넣어주고 나면 키를 생성해주는데 이 때 fullchain 키와, private.pem 키를 받는 경로를 어디에 복사해놓거나 잘 외워줘야 한다.
그러면 딱 지금 현재 Certbot에 의해 생성해준 키는 우분투 서버에 있게 되는데 이를 Nginx 내부로 파일을 복사해주면 된다.
sudo docker cp 현재 우분투 서버에 저장된 키가 있는 위치 도커에 설치된 Nginx이미지이름:Nginx내부에 저장 시킬 위치 // fullchain
sudo docker cp 현재 우분투 서버에 저장된 키가 있는 위치 도커에 설치된 Nginx이미지이름:Nginx내부에 저장 시킬 위치 // private
sudo docker cp /etc/letsencrypt/live/plist.shop/fullchain.pem 05d0e6baf5cd:/etc/ssl/certs/fullchain.pem
sudo docker cp /etc/letsencrypt/live/plist.shop/privkey.pem 05d0e6baf5cd:/etc/ssl/private/privkey.pem
나는 이렇게 입력했다. 그 뒤 다시 우분투서버에 설치해둔 도커에 Nginx를 켜두고 Nginx 내부 파일로 들어가준다.
sudo docker exec -it <도커에 등록된 Nginx 이름> bash 해당 명령어를 통해 들어갈 수 있다.
그리고 꼭 본인이 해당 경로로 들어가서 ssl 키가 정확히 복사가 되었는지 cat 명령어로 확인해봐야한다.
그 다음 나는 Nginx의 conf.d 파일에 default.conf 라는 파일에 Nginx를 이용한 무중단 배포 서버를 구축해놨기 때문에 해당 파일의 경로로 들어가서 ssl에 대한 설정을 추가해 주었다.
빨간색 동그라미와 네모 부분을 추가해주면 ssl에 대한 설정이 끝나게 된다. 이렇게 하면 80포트로 들어오는 요청을 https 리다이렉트를 하면서 nginx가 본인 설정에 대해서 https에 대한 443을 적용시키기 위해 값을 찾아서 알아서 리다이렉트 시켜준다.
성공적으로 연결된걸 볼 수 있다. 물론 해당 작업을 하기전에 자신이 생성한 EC2인스턴스의 보안그룹에서 인바운드 편집에 들어가서 443포트에 대해서 열어줘야 한다.
다음 포스팅은 Nginx와 GitHubActions를 이용하여 무중단 배포했던 경험을 정리해서 포스팅 해보려한다.
'프로젝트 이슈 및 몰랐던점 정리 > PlistAPI' 카테고리의 다른 글
[트러블 슈팅] 포트 분리로 인한 채팅 불가 feat Redis PubSub (0) | 2025.02.27 |
---|---|
[트러블 슈팅] GitHub Actions GradleWrapperMain 에러 (0) | 2025.01.31 |