drexqq

[Python] Flask, Gunicorn, Nginx로 EC2배포하기[2] 본문

Back-End/Python

[Python] Flask, Gunicorn, Nginx로 EC2배포하기[2]

drexqq 2022. 3. 18. 14:23
728x90
반응형

https://drexpp.tistory.com/entry/Python-Flask-Gunicorn-Nginx%EB%A1%9C-EC2%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

 

[Python] Flask, Gunicorn, Nginx로 EC2배포하기[1]

업무중에 새롭게 서버를 만들어야할 일이 있어서 기존에 사용하던 apahce를 버리고 Nginx를 사용하기로 했다. 지금까지의 구성은 EC2(ubuntu 20.04), nginx(1.18.0), python3(3.8.10)를 서버에 올려서 사용하였고

drexpp.tistory.com

 

이 전글에서 쓴것처럼 route53과 elb를 사용해서 호스팅과 ssl인증을 했던 방법을 작성해보겠다.

 

일단 route53에서 호스팅하기위해서는 도메인이 필요하다 나는 freenom에서 무료도메인을 발급받은 상태이기 때문에 도메인 발급받는 과정은 지나치고 route53에서 호스팅을 하기 위한 세팅을 해보겠다.

 

 1. route53에서 호스팅영역 생성하기

우측에 있는 '호스팅 영역 생성' 클릭

 

2. 발급받은 도메인 이름 입력 후 생성

 

도메인 이름 : 발급받은 도메인 이름

설명 : 써있는듯이 선택사항

 

3. ACM에서 ssl인증을 위한 인증서 발급

인증서 요청클릭

퍼블릭 인증서를 발급받을 것이기 때문에 다음 

도메인 이름에 발급받은 도메인 이름 입력

 

검증 방법은 권장하는 DNS 검증을 사용

 

태그 입력은 선택사항이니 입력 후 요청

 

인증서가 생성되었다면 해당 인증서 ID를 눌러서 인증서 안으로 들어가준다

 

도메인탭에 있는 Route53에서 레코드 생성 클릭

2단계에서 생성한 route53에 CNAME으로 ssl인증을 위한 레코드를 생성한다. (레코드 생성 클릭)

 

그 후에 route53에 가서 해당 호스팅영역에 들어가서 확인해보면

아래와 같이 기본적으로 생성되는 NS, SOA이외에 CNAME이라고 생성되어있는 부분을 확인할 수 있다.

 

이제 freenom에 들어가서 발급받은 도메인의 네임서버를 aws route53의  네임서버4개로 바꿔준 뒤에

 

로드밸런서를 생성해보겠다.

aws ec2의 로드밸런싱탭에 로드밸런서로 가서 로드밸런서 생성을 클릭

application load balancer 생성

로드밸런서 이름 입력

최소 2개 이상의 서브넷 설정

보안그룹 설정

리스너, 라우팅 설정

 

이 단계에서 로드밸런싱을 할 대상 그룹을 생성해 두지 않았다면 아래에 있는 대상 그룹 생성을 눌러서 로드밸런싱을 할 대상그룹을 설정해주어야한다.

 

대상그룹 설정

대상 유형은 인스턴스에 연결할 것이기때문에 인스턴스

 

이름을 입력하고, 프로토콜을 HTTP로 설정한 뒤에 다음을 눌러준다

대상으로 할 인스턴스를 선택하고 아래에 보류중인 것으로 포함을 눌러 준 뒤에 대상그룹 생성을 해준다.

 

그 뒤에 다시 로드밸런서 생성하는 곳으로 돌아가서

이 부분에 HTTP리스너와 HTTPS리스너를 만들고 방금 생성한 대상그룹으로 일단 전달을 해둔다.

HTTPS리스너를 추가하기 위해선 보안정책과 SSL인증서를 설정해야하는데 이 때 아까 ACM에서 만든 인증서를 선택해주면 된다.

 

생성이 되었다면 HTTP -> HTTPS자동 연결을 위해서 로드밸런서 탭으로 돌아간다.

로드밸런서 탭에 다시 돌아와서 생성한 로드밸런서를 선택한 뒤 리스너 탭을 보면 아래와 같이 나와 있는데

 

HTTP -> HTTPS 리다이렉트설정을 위해서 HTTP리스너의 규칙편집을 눌러준다.

규칙편집을 누른 뒤 위쪽에 있는 수정 버튼을 누르고 기존에 있던 전달작업을 지운 뒤 작업추가를 눌러서 '리디렉션 대상'을 선택한다.

HTTP 80포트로 들어오는 요청을 HTTPS 443포트로 자동 리디렉션 해주는 작업을 추가한 뒤에 업데이트를 눌러준다.

 

이제 거의 다 됐다.

 

이제 생성한 로드밸런서를 route53에서 사용할 수 있도록 설정해주어야 한다.

 

다시 route53으로 가서 생성한 호스팅 영역에 들어가면 기존에 생성해 두었던 3개의 레코드가 보일텐데 하나의 레코드를 더 추가할 것이기 때문에 레코드 생성을 눌러준다.

레코드 생성을 누른 뒤 단순 라우팅을 선택

단순 레코드 정의를 누른 뒤 레코드 유형을 A

값/트래픽 라우팅 대상을 Application/Class Load Balancer에 대한 별칭을 선택해서 아까 생성한 로드밸런서를 연결해 줄 것이다.

EC2가 존재하는 리전을 선택하고 생성한 로드밸런서를 선택해준 뒤 레코드를 정의해주고 레코드 생성을 눌러준다.

그럼 이런식으로 총 4개의 레코드가 생성되어 있는 것을 확인할 수 있다.

 

이제 제대로 연결이 되어 있는지 확인을 할 시간이다

 

터미널을 열어서 

curl http://[자신의 도메인]

을 입력해주면

이와같이 301 요청을 보내면서 이동되었다고 나올 것이다.

 

그럼 이제 

curl https://[자신의 도메인]

으로 요청을 보내면

이런 메세지가 나올텐데 이건 ec2내에서 설정을 해줘야 한다.

 

일단 SSL인증을 위한 인증서를 생성을 해야한다.

 

 

 

전 게시글에서 생성한 nginx설정 파일을 수정을 해주겠다.

# /etc/nginx/sites-enabled

server {
        listen 443 ssl;

        ssl_certificate /etc/ssl/drexqqga/drexqqga.crt;
        ssl_certificate_key /etc/ssl/drexqqga/drexqqga.key;
        server_name _; # _대신 자신의 도메인을 작성

        root /home/sunghlee/apiserver;

        location / {
                #try_files $uri $uri/ =404;
                proxy_pass http://unix:/run/apiserver.sock;
        }
}

위와 같이 작성해 준 뒤

nginx -t # 문법 체크
service nginx restart # nginx 재실행

nginx를 재실행 시켜준다면

curl https://[자신의 도메인]

해당 명령어 실행시 "Hi Flask Project"라는 글이 나오면 세팅이 SSL세팅이 완료되었다고 볼 수 있다.

 

마지막으로 자신의 도메인으로 접속을 했을때 http로 접속시 https로 리다이렉트를 해준다면 SSL세팅은 끝이다.

 


 

이전에 했던 작업들을 복기하면서 작성을 했기에 틀린 부분도 있고 처음 세팅을 진행하는 부분이여서 완벽한 방법이라고 볼 수는 없지만 해당 작업을 하는 도중에 제가 틀린 부분이나 진행이 막히는 부분 또는 더 좋은 방법이 있다면 댓글로 작성해주시면 감사하겠습니다 !! 이상 끗

728x90
반응형
Comments