728x90

프로젝트를 진행하며 거의 2주간 삽집을 해낸끝에 https적용을 끝냈다.

프로젝트간 react-drf 스택으로 연동을 했기때문에 많은 분들이 도움을 얻어갔으면 좋겠다....

처음엔 도커를 이용하여 배포를 진행하려 했으나 이번 프로젝트 완성이 뭔가 지체되고 있는 느낌이 들어서 일단은 도커를 사용하지 않고 배포 진행하였다.

 

 

(0)인증서 발급 및 방화벽 개방

sudo apt update
sudo apt install snapd
// 재부팅 필수
sudo reboot

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --nginx

위에 해당하는 명령어를 그대로 수행하면 인증서를 발급받을수 있고 자신의 도메인을 입력해주셔야합니다.

해당 명령어를 수행하면 /etc/letsecrypt/live/도메인명/ 경로에 fullchain.pem(도메인 인증서와 Let's Encrypt Chain 인증서 결합)와 privkey.pem(개인키)가 저장됩니다.

 

aws를 이용하신다면 아래와 같이 443포트또한 개방해주셔야 합니다. 다르게 배포하시는 분들도 443포트는 반드시 개방해주셔야 합니다!!

 

(1)gunicorn 설치 

aws의 내 프로젝트 디렉터리 내부에서 가상환경내부에 gunicorn을 설치한다.

pip install gunicorn

사실 처음엔 가상환경 설치하기가 귀찮아서 서버에 라이브러리를 직접 설치하여 진행했는데 프로젝트 관리나 암튼 여러모로 가상환경은 필수니 모두 가상환경내부에 가상환경 실행후 설치를 진행해야한다.

 

(2)폴더에 권한 부여

이부분을 가장 많이 삽질했는데 추후 gunicorn 서비스 등록할때 이용할 유저와 그룹에 대해 권한을 부여해줘야한다.

sudo chown ubuntu:www-data 디렉토리명

aws에서 호스팅해서 사용하시는분들은 대다수 기본 계정이 ubuntu일테니 위와같이 해주시면 됩니다.

ls -alF

위의 명령어를 입력하면 위 사진과 같이 권한이 변경된걸 알수 있습니다. 꼭 django프로젝트가 있는 폴더에 설정해주셔야합니다.

 

(3)정적 파일 수집

기존 python manage.py runserver로 서버를 구동시키는것과는 달리 웹서버를 통해 배포할시 정적 파일을 수집해줘야합니다.

#settings.py
DEBUG=False

...

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

위와같이 설정을 변경해준뒤

python manage.py collectstatic

명령어를 실행해주시면 프로젝트 디렉터리에 static파일이 생성된걸 확인하실수 있습니다.

 

(4)서비스 등록 스크립트 생성

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/Getit/Server
ExecStart=/home/ubuntu/Getit/Server/venv/bin/gunicorn \
        --workers 3 \
        --bind unix:/home/ubuntu/Getit/Server/gunicorn.sock \
        apis.wsgi:application

[Install]
WantedBy=multi-user.target

이해를 돕기위해 프로젝트 디렉터리 명까지 그대로 복붙했는데 /home/ubuntu/Getit/Server 부분을 manage.py가 위치한 자신의 프로젝트 디렉터리 주소를 입력해주시면 됩니다.

 

/etc/nginx/sites-available/getit

server {
        listen 80;
        server_name 도메인;
        charset utf-8;


        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        listen 443 ssl http2;
        server_name 도메인;
        charset utf-8;

        ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;


        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/Getit/Server/gunicorn.sock;
        }

        location /static/ {
                root /home/ubuntu/Getit/Server;
}

        location /media/ {
                root /home/ubuntu/Getit/Server;
        }

}

위에서 도메인은 자신이 구입한 도메인을 쓰면되는데 앞의 http나 https는 붙이지 말고 적어주셔야 합니다.  react와 연동할경우 리액트에서 api서버에 요청하는 그 도메인을 입력해주셔야합니다.

 

간단히 설명 하자면 기존의 http로 접근하는 부분에 대해서는 인증서가 적용된 https 즉 443포트로 요청을 가게 해뒀고 https에서는 전에 발급한 인증서를 토대로 서버를 구성한다는겁니다. 이부분은 프로젝트마다 다를수도 있긴 하지만 별다른 설정이 필요없는경우 위에서 경로만 조금씩 수정해주시면 됩니다. 제프로젝트에서 set_cookie를 사용하는 부분이 있어 nginx에서 별도의 설정이 필요할줄 알았는데 따로 설정할 필요는 없었기 때문에 보통의 상황에서는 별로 추가할 부분은 없을껍니다.

 

(5)사이트 추가

sudo ln -s /etc/nginx/sites-available/getit /etc/nginx/sites-enabled

전단계에서 생성해주었던 nginx관련 설정들을 링크를 걸어줍니다. 따로 이해가 안된다면 일단 그대로 복붙하시면됩니다. getit부분의 파일명은 본인이 설정한것으로 변경해주셔야 합니다.

 

(6)서비스 등록

gunicorn, nginx같은경우 단계를 수행할때마다 등록을 해줬어야 했는데 따로 한번에 등록해줘도 문제는 없습니다.

sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl start nginx

위의 명령어로 서비스를 등록하고 웹서버를 실행시켜줍니다. 

문제가 있다면 서비스가 제대로 등록되었나 아래의 명령어로 확인해줍니다.

sudo systemctl status gunicorn
sudo systemctl status nginx

# 변경사항이 있을경우 무조건 아래의 명령어를 실행시켜줍니다.
sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo systemctl restart gunicorn

프로젝트를 배포하며 https적용에 있어 엄청 어려움을 겪었고 2주간 삽질을하며 많은 시간을 소비했습니다. 정말 힘들게 https를 적용하게 되었는데 만약 위의 내용을 따라 했는데도 문제가 생긴다면 댓글 달아주세요!! 정성스럽게 답변해드리도록 하겠습니다. django는 다른 프레임워크에 비해 한글로된 레퍼런스가 많이 부족하니.. 서로서로 도와서 발전해야겠습니다ㅎㅎ 긴글읽어주셔서 감사합니다.

 

따로 추가 부연설명은 안하고 글을 작성하게 되었는데 좀더 튜토리얼 형식으로 하나씩 해보고 싶으시면 아래의 블로그들 참고 하시면 충분히 도움되실껍니다!

 

도움을 받은 블로그

아래의 순서로 일단 http적용하며 감을 익히고 ssl인증서 발급및 적용해보시면 됩니다!

-nginx gunicorn설정

 

EC2 + Nginx + gunicorn + Django 배포하기

gunicorn 설치 잘 작동되는지 확인 service 파일 등록 Nginx 설치 server (enables, available) 등록 시작 django debug = False로 변경 STATIC_ROOT 설정 collectstatic 실행

velog.io

 

03) Nginx, Gunicorn 배포

[TOC] # 시스템 구성 예시 * 우분투 16.04 * Django * nginx * Gunicorn 다음 설치 예제는 실제 물리서버가 아닌 vultr.com의 가상 ...

wikidocs.net

-인증서 발급 및 nginx gunicorn 스크립트 등록

 

UNLUCKY STRIKE

It's long way to the top if you wanna rock n roll

unluckystrike.com

 

 

728x90

+ Recent posts