Nginx 설치 및 SSL 인증서 발급과 Spring Boot에 맞게 설정하기

 

### apt 패키지 업데이트
$ sudo apt update

### letsencrypt 설치
$ sudo apt-get install letsencrypt -y

### 업데이트
$ sudo apt update
$ sudo apt upgrade -y

### ssl 인증서 제공하는 certbot 설치 + nginx도 함께 설치 됨
$ sudo apt install certbot python3-certbot-nginx

### nginx 실행
$ sudo service nginx start

### SSL 인증서 발급, 나의도메인주소ex)domain.shop
### 첫 번째로 메일 입력
### 동의여부 선택사항 2번 나옴, 약관동의는 동의하시고 이메일 공유는 its up to you
### 1,2	번 선택사항에서는 2번 선택
$ sudo certbot --nginx -d 나의도메인주소

### nginx 폴더로 이동
$ cd /etc/nginx

### 해당 폴더들 권한 추가
$ sudo chmod 777 ./sites-available
$ sudo chmod 777 ./sites-enabled

### 해당 폴더로 이동
$ cd /etc/nginx/sites-available

### 새로운 conf 생성, 이름은 상관없음
$ sudo vi ./test.conf

test.conf에 아래 내용 추가

server {
  listen 80; #80포트로 받을 때
  server_name my-domain.shop; #도메인주소
  return 301 https://my-domain.shop$request_uri;
}

server {
  listen 443 ssl http2;
  server_name my-domain.shop;

  # ssl 인증서 적용하기
  ssl_certificate /etc/letsencrypt/live/my-domain/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/my-domain/privkey.pem;

  location / { # location 이후 특정 url을 처리하는 방법을 정의(여기서는 / -> 즉, 모든 request)
    proxy_pass http://localhost:8000; # Request에 대해 어디로 리다이렉트하는지 작성. 8000 -> 자신의 springboot app이사용하는 포트
    proxy_set_header Host $http_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;
  }
}

server {
    if ($host = my-domain.shop) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  server_name smy-domain.shop;
    return 404; # managed by Certbot

}

- 80포트로 받았을 경우 redirect 시켜줌

- 443으로 받았을 경우 http://localhost:port로 redirect 시켜줌, 여기서 port는 spring boot에서 사용하는 port번호를 이용!

 

이후,

### sites-available의 test.conf를 sites-enabled에 복사
$ sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled

### 해당 폴더로 이동
$ cd /etc/nginx/sites-enabled

### 문제없는지 테스트
$ sudo nginx -t

### default 파일 삭제
$ sudo rm default

### 재시작
$ sudo service nginx restart

위와 같이 함으로써 HTTP, HTTPS로 request가 들어올 시 spring boot로 redirect가 가능 함

'Develop > Server' 카테고리의 다른 글

[에러] Enable to lacate package  (0) 2022.05.22
가비아 도메인 설정과 HTTPS 설정  (0) 2022.05.20
Docker를 이용한 서버 배포  (0) 2022.05.20
RDS 생성 및 외부 접속 연결  (0) 2022.05.18
EC2 인스턴스 및 고정 IP 설정  (0) 2022.05.11

sudo apt install 무언가를 하였을 때 Enable to lacate package [패키지 명]이 나오며  설치가 되지 않는 문제가 있었습니다.

sudo apt update를 해도 같은 문제가 발생하였습니다.

 

원인
ubuntu에서 package를 다운로드하는 홈페이지 주소가 포함되어 있지 않아 그런 것이였습니다.

해결

/etc/apt/source.list 의 가장 아래에 아래 내용을 추가하면 해결할 수 있습니다.(source.list는 백업을 해놓는 것이 안전합니다)

deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse

apt를 업데이트 합니다.

$ apt-get update

 

1. 서버 NGINX 설치

우선 서버에 NGINX를 설치하지 않아 이 작업부터 수행해 주도록 하겠습니다.

굉장히 간단합니다.

$ sudo apt update
$ sudo apt install nginx
$ sudo service nginx start
$ sudo service nginx status

해당 명령어 들을 이용하여 nginx를 설치하고 정상적으로 작동하는지 확인해 줍니다.

 

2. DNS로 사용할 도메인 구매

가비아 사이트를 이용하여 원하는 도메인을 하나 구매해 줍니다.

따로 설명하지는 않겠습니다.

 

3. 구매 도메인 서버와 연결

가비아에 로그인 -> My가비아 -> DNS 관리툴 을 누르게 되면 새로 구매한 도메인이 있을 것 입니다.

해당 도메인의 DNS 설정을 눌러주고 ec2 서버의 퍼블릭 ip 주소를 입력해 줍니다.

참고로 호스트의 @는 아무 시작 없이 단순 도메인만 쳤을 때를 의미합니다.

ex) www.abc.shop / abc.shop

완료 후 저장을 눌러주면 몇분뒤 설정이 완료 됩니다.

(저는 좀 오래걸려 한 30분 걸렸던거 같습니다;;; 그때그때 다른거 같아요)

 

4. SSL 설치

업데이트 후 certbot 소프트웨어를 설치해 줍니다.

$ sudo apt update 
$ sudo add-apt-repository ppa:certbot/certbot

다시 apt를 업데이트 해주고 certbot nginx 패키지를 설치해 줍니다.

$ sudo apt update 
$ sudo apt install python-certbot-nginx

여기서 패키지들이 설치되지 않는 오류가 발생하였었는데 해결방법은 따로 포스팅 하겠습니다.

 

이제 nginx의 설정파일을 수정해 주어야 합니다.

$ sudo vi /etc/nginx/sites-available/default

해당 코드로 들어가서 server_name 부분을 도메인으로 변경해 줍니다.

변경 후 nginx 설정 파일에 문제가 없는지 테스트를 진행합니다.

문제가 없다면 nginx를 재시작 해줍니다.

$ sudo nginx -t
$ sudo service nginx restart

이제 아래의 명령어로 인증서를 발급받습니다.

$ sudo certbot --nginx -d 도메인

중간에 1과 2에 대한 질문을 하는데 http로 연결이 들어왔을 때 redirect를 해줄것인지에 대한 물음입니다.

1은 수행하지 않고, 2는 수행해줍니다. 저는 2를 선택하였습니다.

 

https://www.ssllabs.com/ssltest/

 

SSL Server Test (Powered by Qualys SSL Labs)

SSL Server Test This free online service performs a deep analysis of the configuration of any SSL web server on the public Internet. Please note that the information you submit here is used only to provide you the service. We don't use the domain names or

www.ssllabs.com

해당 사이트에서 SSL이 잘 인증되었는지 확인할 수 있습니다.

 

Let's Encrypt의 인증서는 90일 동안만 유효하므로, 90일마다 갱신해줘야 합니다.

설치를 하는 과정에서 자동으로 갱신 시켜주는 커맨드가 추가되어 있습니다.

갱신이 잘 동작하는지 테스트를 해보고 마무리 하겠습니다.

$ sudo certbot renew --dry-run

 

갱신에 대해서는 crontab을 이용하는 방법도 있습니다.

매월 2일 03시 수행

ex) 0 3 2 * * sudo certbot renew --standalone --pre-hook "service nginx stop" --post-hook "service nginx start"

이번에는 도커를 이용해 스프링 프로젝트를 배포하기 위한 작업을 수행하겠습니다.

local에서 도커파일을 빌드하면 도커 이미지가 생성됩니다. 이후, 이 도커 파일을 서버로 옮겨주기 위해 도커 허브에 이미지를 push 합니다.

 

그리고 외부 서버에서는 도커허브로 부터 해당 이미지를 pull 받습니다.

 

그 후 해당 도커 이미지를 실행시켜주면 됩니다.

 

천천히 한 단계씩 수행해 보겠습니다. 

1. EC2 docker 설치

저는 ubuntu 20.04 버전을 기반으로 설치를 진행하였습니다.

가장 간단한 방법으로 진행하였으며, 아래의 두 명령어를 입력 하고 기다려 줍니다.

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

이 후 아래 명령어를 입력하였을 때 아래와 같이 나오면 정상적으로 설치가 완료된 것입니다.

$ sudo docker version

 

2. 로컬 도커 설치 및 컨테이너 만들기

 해당 부분은 이미 수행을 해 놨기에 말로만 따로 설명을 하도록 하겠습니다.

로컬에서도 도커를 설치 한 후 https://hub.docker.com/ 으로 이동하여 회원가입을 하고 로그인을 한 후 create repository를 통해 저장소를 하나 만들어 주면 되겠습니다.

 

3. 로컬 -> 도커 컨테이너 -> EC2

- 프로젝트 폴더에 도커 파일을 만들기 : 인텔리제이에서 dockerFile 파일을 만들고 spring docker 등을 검색하여 나오는 형식으로 파일을 구성해 줍니다.

로컬에서 명령어를 통해 컨테이너 내부의 이미지 파일을 확인합니다.(로컬에 도커 로그인이 되어있다는 가정 하)

$ docker images

Spring project 에서 프로젝트를 빌드 해 줍니다.

$ gradlew clean build

해당 명령어를 통해 이미지 파일을 만들어 줍니다.

$ docker build --build-arg DEPENDENCY=build/dependency -t [아이디]/[레포지토리]:[버전] --platform linux/amd64 .

위 코드에서 아이디 부분은 도커의 아이디(ex ABC123), 레포지토리는 생성된 레포지토리 이름(ex REPO), 버전은 생성할 버전을 의미합니다(ex 0.0.1). 뒤의 --platform linux/amd64 . 은 mac이 인텔 칩이 아닌 amd 칩을 사용하여 추가로 설정해 주어야 하는 부분입니다.

 

이제 다시  $ docker images 를 입력해 보면 새로운 이미지 파일이 하나 나타날 것입니다.

이제 만들어준 이미지 파일을 도커 허브 레포지토리에 PUSH 해 보겠습니다.

$ docker push [아이디]/[레포지토리]

이제 EC2 서버로 가서 해당 파일을 PULL 받아 옵니다.

$ sudo docker pull [도커 아이디]/[레포지토리]:[버전]

이때, 만약 해당 레포지토리를 private으로 했다면 해당 도커로의 로그인이 필요합니다.

$ sudo docker login -u [도커 아이디]

해당 명령어를 치게 되면 비밀번호를 치라고 나오는데, 이때 로그인이 완료되면 다시 pull 받아오면 됩니다.

이제 받아온 이미지 파일을 실행시켜 보겠습니다.

$ sudo docker run -p [포트]:[포트] [아이디]/[레포지토리]:[버전]

포트번호와 해당 이미지 파일을 입력하면 해당 프로젝트가 정상적으로 작동하는 것을 볼 수 있습니다.

1. RDS 생성

RDS는 AWS에서 지원하는 관계형 데이터 베이스 입니다.

인스턴스에서 데이터베이스를 사용하는 것보다 편하고 용량도 크게 쓸수 있기에 사용합니다.

 

생성하는 방법은 아주 쉽습니다.

AWS에서 RDS를 검색하고,  데이터베이스 생성을 누릅니다.

저는 Mysql을 이용할 것이기 때문에 Mysql을 눌러주고, 템플릿은 무료버전인 프리티어를 선택해 줍니다.

이후 이름을 설정해 주고 자격증명 설정에서 사용자 이름과 비밀번호를 설정해 줍니다.

 

이후에는 기본값들을 설정해 주고, 퍼블릭 엑세스를 "예"로 바꿔줍니다. 이 후 제가 직접 사용 하는 IP들만 접근을 허용하도록 바꿔줄 것이며 보안그룹은 새로생성을 눌러주고 보안그룹 이름을 설정해 줍니다.

추가 구성에서는 데이터베이스의 초기 이름만 설정 해 주었습니다.

그리고 완료해주면 생성중으로 RDS가 하나 추가되게 됩니다.

 

2. RDS 파라미터 환경 설정

RDS를 사용하기 전, 편의를 위해 설정해 주면 좋은 몇가지가 있습니다.

저는 보통 필수적으로 TImezone 변경, CharacterSet 변경을 해주고 있으며 Max Connection도 수정해 주면 좋다고 해서 이번에는 수정해 주었습니다.

RDS에서 좌측에 있는 파라미터 그룹 항목을 눌러줍니다.

파라미터 그룹 패밀리는 아까 생성해 놓은 데이터베이스와 버전이 같으면 됨으로 변경하지 않아도 됩니다.

이후 이름과 설명을 추가해주고 생성을 누르면 파라미터 그룹이 하나 만들어 집니다.

 

이후 파라미터를 누르고 우측 상단의 파라미터 편집을 눌러줍니다.

1. TIME_ZONE 변경

 - 검색창에 time_zone을 검색하고 time_zone을 Asia/Seoul(한국 시간대) 로 바꿔줍니다.

2. CharacterSet 변경

- 검색창에 char 라고 검색하였을 때 utf8mb4 를 고를 수 있는 모든 항목을 utf8mb4로 바꿔줍니다. 원래는 utf8 까지만 했었지만 이모지가 적용되지 않는 문제가 발생하여 이를 해결하기 위해 utf8mb4로 사용합니다.

- Collation을 검색하여 나오는 두가지 선택지를 utf8mb4_general_ci로 선택해 줍니다.

3. Max Connection 변경

Max Connection은 프리티어의 기준 60 정도라고 합니다. 이를 넉넉하게 150으로 바꿔주는 것이 좋다고 하여 이 또한 바꿔주었습니다.

이제 변경 사항을 저장해 주고 이전의 데이터 베이스에 연결해 주어야 합니다. 좌측의 데이터베이스를 다시 선택하고, 데이터베이스 수정을 누릅니다.

추가 구성의 DB 파라미터 그룹을 아까 생성한 파라미터 그룹으로 바꿔줍니다.

이 후 계속을 누르고 예약이 아닌 즉시 적용을 선택한 후 수정을 눌러줍니다.

3. RDS 외부 접속(EC2 및 로컬)

RDS를 외부에서 접속하기 위해서는 보안그룹의 인바운드 규칙을 열어주어야 합니다. 우선 ec2와 로컬에 대해 인바운드 규칙을 수정해 주겠습니다.

ec2로 접속하여 좌측의 항목에서 보안그룹으로 들어갑니다.

RDS의 보안그룹을 선택하고 인바운드 규칙을 눌러서 편집을 눌러줍니다.

3306 mysql 포트를 선택하고 ec2의 ip 주소와 로컬의 ip주소를 입력해 주면 완료됩니다.

저는 intellij에서 지원하는 외부접속을 이용하기에 RDS의 주소와 계정, 비밀번호를 치고 연결하였더니 잘 연결되는 것을 확인하였습니다.

(운영체제는 Mac 사용중입니다.)

1. 인스턴스 생성

Ubuntu 서버로 선택하여 주고 가장 최근의 버전을 생성하기 보단 한단계 낮은 20.04 버전을 선택하였습니다.

프리티어로 사용할 수 있는 서버를 선택하여 주었으며 pem 파일(키페어)을 다운로드 받았습니다. 

추후에 RDS를 데이터베이스로 사용할 것이기 때문에 스토리지도 가장 적은량(기본설정) 만큼만 부여하였습니다.

그렇게 인스턴스 생성을 마치고 조금 기다리면 인스턴스가 실행 상태로 변경됩니다.

 

이제 제대로 수행이 되는지 테스트를 해봐야 합니다.

EC2의 해당 메뉴에서 인스턴스를 선택하고 연결을 누르게 되면 인스턴스에 연결하는 여러가지 방법이 나옵니다. SSH 연결을 눌러 마지막에 있는 예시 명령어를 복사해 줍니다. (ex. ssh -i "aaaaa" ~ )

복사 후 pem 파일을 받은 위치로 가서 해당 명령어를 실행해 주면 됩니다.

저같은 경우 정상적인 실행이 안되고 해당 오류가 뜨는 경우가 발생하였습니다. 이는 pem 파일이 너무 개방적이라서 발생하는 오류라고 합니다.. 어떻게 보면 중요한 파일이니, 권한을 축소해 주어야 한다고 합니다.

그래서 해당 파일의 권한을 600으로 바꿔주니 정상적으로 실행 되었습니다.

( 해결 명령어 : chmod 600 xxxxx.pem)

해당 서버로 접속이 잘 되는 것은 확인 하였으니 이제 인바운드 규칙을 수정하겠습니다.

 

2. 인바운드 규칙 생성

인스턴스 생성이 완료되었다면, 해당 서버에서 사용할 포트들을 열어줘야 합니다.

인스턴스 화면 좌측에서 조금만 내려 보면 네트워크 및 보안 부분에 보안 그룹 이라는 항목이 있습니다.

해당 페이지로 넘어가 보면 default 한개와, 저희가 만들었던 인스턴스에 적용되는 보안그룹이 launch-wizard-1과 같은 이름으로 생성되어 있을 것입니다. 추후 보안 그룹이 늘어나게 되면 헷갈릴 수있으니 Name 부분에 별명을 하나 설정해 주고 "인바운드 규칙 편집" 을 눌러줍니다.

저는 SSH, HTTP, HTTPS ,Mysql 정도 사용할 것이기 때문에 우선 이렇게만 설정해 주었습니다.

추후에 필요에 따라 인바운드 규칙을 열고 닫아 주며 사용하면 됩니다.

 

3. 고정 IP 설정

고정 IP를 설정해야 하는 이유?

-> EC2에서는 인스턴스를 중지하였다가 다시 실행할 경우 ip주소가 바껴서 할당이 되게 됩니다. 중지할 일이 없다면 문제가 되지 않겠지만 분명 중지할 일이 생길 수 있고, 한참 개발을 수행하다가 ip 주소가 바뀌게 되면 상당히 귀찮은 일이 발생합니다..;; 미리미리 고정 IP 설정을 해서 걱정없이 쓰는게 좋다고 판단되어 인스턴스 생성할 때 마다 바로바로 고정 IP를 설정하는 것을 추천드립니다.

 

보안그룹 선택할 때 보았던 네트워크 및 보안 항목에 보면 탄력적 IP 라는 항목이 있습니다. 해당 항목에 들어가서 우측 상단의 "탄력적 IP주소 할당" 을 누르고 할당을 눌러줍니다.

그렇게 되면 고정 IP 하나가 할당되게 됩니다.

이제 이 고정 IP를 저희가 만들었던 인스턴스와 연결을 해 주어야 합니다. 만들어진 고정 IP를 누르고 우측 상단의 작업을 눌러 탄력적 IP 주소 연결을 눌러주면 아래와 같은 화면이 나오게 됩니다.

해당 화면에서 인스턴스 부분을 누르게 되면 저희가 생성을 해 놓았던 인스턴스가 나타나게 됩니다. 해당 인스턴스를 눌러준 후 연결을 눌러주면 저희가 만든 인스턴스에 고정 IP 주소 할당이 완료됩니다.

이 후 인스턴스로 이동하면 해당 주소가 할당되어 있는 것을 확인할 수 있고 테스트로 인스턴스 중지를 했다가 다시 실행 시켜도 IP 주소가 변하지 않는 것을 볼 수 있습니다.

 

* 한가지 주의할 점은 고정 IP는 만들어 놓고 사용하지 않는다면 과금이 들어가게 됩니다. (사용한다면 과금이 되지 않습니다.)

 

+ Recent posts