❗️ Root 계정으로 진행하지 않는다.
Root 계정(계정이 처음 만들어졌을때 Root 계정이다)을 사용하고 있는 경우 IAM → 사용자 → 사용자 추가를 선택해 하위 계정을 생성해 진행한다. AdministratorAccess 권한이면 충분하다. 직접 정책 연결할 수도 있고 권한이 지정된 그룹에 사용자를 추가할 수도 있다.
IAM 맨 오른쪽 'AWS 계정' 섹션에서 기억하기 쉽도록 계정 별칭을 지정한다. 필자는 thebjko-alias로 지정했고, 유저명은 thebjko이다. 로그인 화면은 다음과 같다:
VPC는 그대로 두면 된다.
EC2 인스턴스로 들어오는 트래픽에 대한 규칙. 모든 소스(0.0.0.0/0, IPv4)에서 HTTP와 SSH를 허용하고 진행한다.
EC2 인스턴스에서 나가는 트래픽에 대한 규칙. 모든 소스(0.0.0.0/0, IPv4)로 HTTP를 허용한다.
키 페어는 ssh로 접속하기 위해 필요하다. 여기선 EC2 Instance Connect를 사용해 진행한다.
기존 보안 그룹 선택 → 위에서 생성한 보안 그룹 선택
해당 인스턴스를 선택하고 연결 클릭한다.
Connect(연결) 클릭
프로젝트 중 django-allauth 패키지를 사용했는데, 어떤 이유에선가 가상환경에서 설치가 안된다. 한 스택 오버플로우 답변에서는 파이썬 버전을 다운그레이드 하라고 하는데, pipenv라는 가상환경에서는 문제 없이 설치가 되어, 가상환경으로 pipenv를 사용하기로 한다.
💁 Ubuntu 22.04 LTS의 디폴트 파이썬 버전은 3.10.6이다. 이 버전 이하의 파이썬을 사용했다면 이 과정은 생략해도 좋을 것 같다.
python
으로 python3
를 호출하기 위한 패키지sudo apt install python-is-python3
sudo add-apt-repository ppa:deadsnakes/ppa
ENTER
sudo apt update && sudo apt install python3.11 -y
python3
으로 호출할 파이썬 지정sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 110 && sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 100 && sudo update-alternatives --config python3
실행 후 적절한 파이썬을 선택한다. 필자의 경우 2
sudo apt-get update
명령을 실행하면 apt_pkg
모듈이 없다는 에러가 뜰 것이다. 아래 명령을 실행해 현재 apt_pkg
버전을 확인cd /usr/lib/python3/dist-packages && ls -l | grep apt_pkg
sudo ln -s apt_pkg.cpython-{확인한 apt_pkg 버전}-x86_64-linux-gnu.so apt_pkg.so
필자의 경우 310
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y nginx && sudo apt-get install supervisor
Pip과 가상환경인 pipenv를 설치해야 한다. 파이썬 버전을 전면 개정했기 때문인 것 같다.
cd ~ && curl https://bootstrap.pypa.io/get-pip.py -O && python get-pip.py && . ~/.profile && pip install pipenv
홈 디렉토리로 이동해 pip 파일을 받고 실행 한다. ~/.profile
파일을 실행해 ~/.local/bin
디렉토리를 PATH에 추가해야 그 안에 있는 pip 명령을 바로 실행할 수 있다. 이후 pip install pipenv
를 실행해 설치한다.
홈 디렉토리에서 가상 환경을 실행한다. (좀 더 구체적인 디버깅이 필요하겠지만, 특정 디렉토리에서 실행했을 때 잘 안 되던 것 같다는 기억이 있다. 홈 디렉토리에서 생성한 가상환경은 잘 작동했기 때문에 이 글에서는 홈 디렉토리에서 실행한 가상 환경에서 진행한다.)
프로젝트 디렉토리 생성 및 깃허브 클론 후 requirements.txt 파일을 사용해 필요 패키지들을 설치한다.
pipenv shell && pipenv install -r project/requirements.txt
/etc/supervisor/conf.d
디렉토리로 이동해 gunicorn.conf
파일을 생성한다.
cd /etc/supervisor/conf.d && sudo vi gunicorn.conf
슈퍼유저 권한으로 실행(sudo
)해야 편집 가능하다. 아래와 같이 입력한다.
[program:gunicorn]
directory=/home/ubuntu/{project 디렉토리}
command={gunicorn 커맨드가 있는 위치} --workers 3 --bind unix:/home/ubuntu/{project 디렉토리}/app.sock {어플리케이션 이름}.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
programs:gunicorn
whereis gunicorn
커맨드로 확인할 수 있다. 이 프로젝트의 경우 /home/ubuntu/.local/share/virtualenvs/ubuntu-iR9coyfD/bin/gunicorn
WSGI_APPLICATION
에서 확인할 수 있다. 'config.wsgi.application'
인 경우 config
로 작성한다.로그 파일이 저장될 장소를 생성한다
sudo mkdir /var/log/gunicorn
아래 명령으로 상태를 확인한다.
sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl status
RUNNING이 나오면 잘 작동한다는 뜻이다. 잘 안될경우 sudo systemctl restart supervisor
명령으로 supervisor를 재시작해보자.
아래 파일에서 user를 root이나 ubuntu로 수정하자.
sudo vi /etc/nginx/nginx.conf
user root;
파일 생성 후
sudo vi /etc/nginx/sites-available/django.conf
아래 내용 작성
server{
listen {사용할 포트 번호};
server_name {접근할 주소. 띄어쓰기로 구분해 여러개 사용 가능};
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/{project 디렉토리}/app.sock;
}
}
/etc/nginx/nginx.conf:
http {
server_names_hash_bucket_size <size>;
...
}
sudo nginx -t
작성한 내용이 nginx 문법에 맞는지 검사한다.
/etc/nginx/sites-enabled
에 django.conf에 대한 심볼릭 링크 생성 및 nginx restartsudo ln /etc/nginx/sites-available/django.conf /etc/nginx/sites-enabled
ln
: ln TARGET DIRECTORY
의 형태로 사용. TARGET에 대한 symbolic link를 DIRECTORY 안에 생성한다.Nginx 재시작
sudo service nginx restart
ALLOWED_HOSTS
리스트에 추가하고, 서버를 재부팅하거나 sudo systemctl restart supervisor
명령으로 supervisor만 다시 실행해 변경사항을 반영할 수 있다.mysqlclient
가 설치되지 않으면 sudo apt install -y python3.11-dev libmysqlclient-dev libssl-dev
ModuleNotFoundError: No module named 'apt_pkg'
mysqlclient
가 설치되지 않을 때