회사에서 필요한 테스트 서버를 구축하기 위해
현재 사용하고 있는 python django를 위한
서버 세팅을 하게 되었습니다.
ec2 - ubuntu 인스턴스 유형 - t2 micro(프리티어 사용가능 추후 변경 가능)
mac os (big sur)
miniconda (가상환경) 참고로 로컬 가상환경은 venv를 사용합니다.
Django 3.1.7
mysql
aws 계정을 만드는 과정은 생략하도록 하고 해당 계정에 ec2를 생성하면 되는데
ec2를 생성할 때 신경 써야 할 부분은 스토리지와 서브넷, ec2 인스턴스 유형입니다.
※ ec2 생성 후 고정적인 ip 설정을 위한 탄력적 ip 생성하기
ec2 보안그룹 설정 시 아래와 같이 설정하면 됩니다.
⚠️ 참고로 ssh 접속은 보안때문에 모든 ip에서 접근이 되면 안되므로 특정 ip만 설정해야 합니다.
인스턴스 생성하면서 받은 pem키를 새로운 디렉토리로 저장한 뒤
파일의 권한을 바꿔줘야 합니다.
# 터미널을 키고, pem 파일을 받아 놓은 위치로 간다.
# 해당 위치에서 아래의 명령어 입력
$ chmod 400 키페어파일이름.pem
권한 변경 후 아래의 명령어로 ssh 접속 가능합니다.
ssh -i 키페어파일이름.pem ubuntu@퍼블릭 ip(탄력적 ip)
ec2 접속할 때마다 위의 긴 명령어를 사용하기에는 부담이 되므로
# 아래의 명령어로 설정 파일을 열고 alias 설정
$ vi ~/.zshrc
# 설정 후 적용을 위한
$ source ~/.zshrc
# pem키가 있는 디렉토리로 이동 후
ex) $ enter 와 같이 alias로 설정해 준 단축어를 이용해 ec2 접속

# 터미널에서 아래에 복사한 링크 붙여넣기
$ wget https://repo.ananconda.com/minicona/Miniconda3-latest-Linux-x86_64.sh
# 실행권한 주기
$ chmod +x Miniconda3-latest-Linux-x86_64.sh
# 미니콘다 실행시켜서 설치하기
$ ./Miniconda3-latest-Linux-x86_64.sh
# 엔터 와 yes로 모든 과정 건너뛰기
# bash shell 스크립트를 실행해서 로컬 환경과 같게 설정하기
$ source .bashrc
# 이 과정을 거치면 명령어 제일 앞에 (base) 생성
위의 과정에 이어서 가상환경 (미니콘다) 설치
# 패키지 업데이트 및 업그레이드
$ sudo apt-get update
$ sudo apt-get upgrade
# mysql 클라이언트 설치시 에러 안나게 하려면 gcc 설치 필요
$ sudo apt-get install gcc
$ sudo apt-get install libmysqlclient dev
# 가상환경 생성
$ conda create -n [생성하고 싶은 가상환경 이름] python=3.8.5
# 가상환경 활성화
$ conda activate project
원하는 경로에 프로젝트 디렉토리 생성 후
해당 디렉토리에서 git clone 으로 django project 생성하기
# git clone
$ git clone 깃허브에서 복사해온 깃레퍼지토리 주소
# requirements 설정
$ pip install -r requirements.txt
$ pip freeze (설치 여부 확인)
# mysqlclient 설치 오류 시
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
$ python manage.py runserver 0.0.0.0:8000
위의 명령어를 실행하고 http://탄력적ip 또는 dns주소:8000 로 접속하면

짜잔! 위의 화면이 뜹니다.
하지만 여기서 끝난 게 아니죠 ... 실 서비스를 위해서는 백그라운드로 24시간 돌려야 합니다.
gunicorn은
웹 서버에서 장고 웹 애플리케이션을 돌려주는 방식
$ pip install gunicorn
$ pip freeze > requirements.txt
※ 로컬서버와 ec2의 환경을 맞춰줘야 한다.
# gunicorn 동작시키기
$ gunicorn --bind=0.0.0.0:8000 프로젝트명.wsgi &
#settings.py 가 있는 폴더명
# gunicorn 동작 확인
$ ps -ef | grep python
$ sudo apt-get install nginx
# 서버 블록 파일 동기화(?)
$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
# default 대신 다른 이름으로 새로운 파일을 설정해도 상관 없습니다.
$ cd /etc/nginx/sites-available
$ sudo vi default 로 해당 파일로 들어간 후
server {
location / {
include proxy_params;
proxy_pass http://unix:/tmp/gunicorn.sock;
}
}
AWS Route53 에서 도메인 구입 및 서버와 연결
↓
certificate Manager에서 Https 설정을 위한 SSL 인증서 받기
↓
메일 인증으로 인증서 검토 완료 후 로드밸런서와 ec2 연결
요청 -> 로드밸런서 -> ec2
위의 과정을 거치기 때문에 도메인 설정에서는 ec2 퍼블릭 ip 가 아닌 로드밸런서의 DNS 이름을 넣어야 합니다.
※ 단, 레코드 유형은 cname으로 해야 합니다.
또한 로드밸런서 설정 시 서브넷과 보안그룹 설정을 잘못하면 503 에러가 발생할 수 있기 때문에 주의 해야 합니다. 참고로 저는 리스너 -> 규칙보기 -> target 그룹을 설정해주지 않아 503에러가 났고 한동안 삽질을 했었습니다..
http로 요청이 들어올 때 https로 리다이렉트 설정은 aws 로드밸런서나
sudo vi /etc/nginx/sites-enable/default 에서 아래와 같이 입력 후 저장하면 적용됩니다.
-> server{
if (http_x_forwarded_proto = 'http') { return 301 https://도메인 주소request_uri;
}
}
⚠️ 모든 nginx 설정을 변경하고 해당 변경사항을 적용하려면
$ sudo nginx -t 로 syntax 테스트 후 에러가 없다면
$ sudo systemctl restart nginx로 nginx 재구동
sudo vi /etc/systemd/system/gunicorn.service
위의 파일 생성 후 아래와 같이 입력
[unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/프로젝트디렉토리 경로
ExecStart= $ which gunicorn 으로 얻은 경로 \
--workers 3 \
--bind unix:/tmp/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
위의 파일을 저장한 후
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
# 상태 확인
$ sudo systemctl status gunicorn
# 서비스를 새로 등록하거나 수정할 경우 데몬을 리로드 해주어야 합니다. 아래의 과정을 거치면 됩니다.
$ sudo systemctl stop gunicorn
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo systemctl enable gunicorn
$ sudo systemctl status gunicorn