본문 바로가기

파이썬 - python

django nginx gunicorn 배포하기 / aws ec2

장고 엔진엑스 지유니콘, EC2 배포 과정

사전 내용

  • 깃허브에 프로젝트 올리기
  • EC2 인스턴스 생성 > ssh 접속

우분투 초기 설정

# 우분투 패키지 업데이트
sudo apt update && sudo apt upgrade

# 계정 비밀번호 설정
sudo passwd root
sudo passwd ubuntu

# 지역 설정
sudo locale-gen ko_KR.UTF-8

# 시간 설정
su

dpkg-reconfigure tzdata

Asia

Seoul

# 서버 이름 변경
sudo vi /etc/hostname
> {서버이름}

sudo vi /etc/hosts
> 127.0.0.1 {서버이름}

# ssh 키 설정
ssh-keygen

# 작업 장비 ssh 반영
vi ~/.ssh/authorized_keys
> 작업 장비의 ~/.ssh/id_rsa.pub 내용 추가


# 단축어 등록
vi ~/.bashrc

alias 단축어:'실행명령어'

alias vi:'vim'
export DJANGO_SETTINGS_MODULE=config.settings.prod

# 변경 내용 반영
source ~/.bashrc

# 재부팅
sudo shutdown -r now
# 

필요 패키지 설치

# 에디터
sudo apt install vim
# 깃 - 기존에 있음
sudo apt install git

깃에서 프로젝드 클론

# 서버 키 깃허브 등록 계정정보 기반일 경우 필요없음
id_rsa.pub > gitgub > setting > Deploy keys

git clone 프로젝트 경로

# 시크릿키 파일 생성 (있는경우)
secrets.json

{
  "SECRET_KEY": "..."
}

파이썬 설치, 가상환경 구축

패키지 설치
sudo apt install python3.7 python3-pip python3.7-dev

sudo apt install virtualenv

# 파이썬 패키기 관리자 업데이트
pip3 install --upgrade pip

# 가상환경 패키지 설치
# pip3 install virtualenv

# 가상환경 생성 / 프로젝트 안
virtualenv --python=python3.7 venv

# 가상환경 접속
source venv/bin/activate

# 프로젝트 파이썬 패키지 설치
pip3 install -r requirements.txt

# DB 생성 / 없을 경우
python3 manage.py migrate

# 관리자 계정 생성
python3 manage.py createsuperuser

# 정적 파일 생성
python3 manage.py collectstatic

gunicorn 설치/실행

# 지유니콘 설치
pip3 install gunicorn

# 
sudo ufw allow 8000
#
sudo ufw delete allow 8000

# 테스트 실행
gunicorn config.wsgi:application —bind 0.0.0.0:8000

# 정상 작동 테스트
curl -i http://localhost:8000

# gunicorn.service 생성
sudo vi /etc/systemd/system/gunicorn.service

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

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/{프로젝트 경로, mamage.py 위치
ExecStart=/home/ubuntu/{프로젝트 경로, mamage.py 위치}/venv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          {프로젝트 명}.wsgi:application

[Install]
WantedBy=multi-user.target

# 지유니콘 소켓 생성
sudo vi /etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket 

[Socket]
ListenStream=/run/gunicorn.sock 
SocketUser=www-data

[Install]
WantedBy=sockets.target


#wsgi.py 배포설정 지정
vi {프로젝트 경로, mamage.py 위치}/config/wsgi.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.prod')

# 지유니콘 실행
sudo systemctl start gunicorn
# 서버 실행시 자동 실행
sudo systemctl enable gunicorn
# 지유니콘 상태 확인
sudo systemctl status gunicorn

# 소켓확인
file /run/gunicorn.sock
# Output
/run/gunicorn.sock: socket

# 지유니콘 재설정 시
sudo systemctl daemon-reload
sudo systemctl restart gunicorn

# 오류 시 로그 확인
sudo journalctl -u gunicorn.socket

# 지유니콘 프로세스 확인
ps -ef | grep gunicorn
# 지유니콘 상태 확인
sudo systemctl status gunicorn

nginx 설치/설정

# 엔진엑스 패키지 설치
sudo apt install nginx

# 정상 설치 확인
curl -i http://localhost

# 엔진엑스 설정/로그파일
/etc/nginx/nginx.conf
/var/log/syslog
/var/log/nginx/access.log
/var/log/nginx/error.log

# 엔진엑스 페이지 설정 경로
cd /etc/nginx/sites-available/

# 기존파일 백업
sudo cp default default.bak

# 페이지 수정 - 지유니콘 연결
sudo vi /etc/nginx/sites-available/default

server {
        listen 80;

        server_name {도메인, 아이피주소 naver.com} 

        proxy_set_header X-Forwarded-Proto $scheme;

        location = /favicon.ico { access_log off; log_not_found off; }

        # gunicorn app
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Url-Scheme $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $http_host;

                proxy_redirect off;
                proxy_pass http://unix:/run/gunicorn.sock;
        }

        location /static/ {
                autoindex on;
                alias /home/ubuntu/{프로젝트 경로, mamage.py 위치}/static/;
        }

        location /media/ {
                autoindex on;
                alias /home/ubuntu/{프로젝트 경로, mamage.py 위치}/media/;
        }
}

# 페이지 공개
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

# nginx 설정 파일 문법 확인
sudo nginx -t

# 엔진엑스 재실행
sudo service nginx restart
sudo systemctl status nginx

# 정상 설치 확인
curl -i http://localhost