Django 기본 세팅
먼저, Django 기본 세팅으로 requirements.txt 업데이트
pip freeze > requirements.txt
poetry 가상환경을 사용한 경우, 아래 명령어 입력
poetry export -f requirements.txt --output requirements.txt --without-hashes
EC2 인스턴스 생성
[인스턴스 시작]
[연결]을 누르면 아래와 같은 [EC2 Instance Connect]라는 탭이 새로 뜬다
Ctrl + Shift + v : 붙여넣기
EC2 기본 세팅
$ ls : 파일 목록을 보여주는 명령어
$ sudo apt update : 시스템 패키지 관리자 업데이트
$ sudo apt upgrade : 시스템 패키지 최신 버전으로 업그레이드
$ sudo apt install python3-pip python3-dev python3-venv
: python3 개발 환경을 구축하기 위해 필요한 패키지들 설치
> python3-pip : python 패키지 관리자 pip 설치
> python3-dev : python 개발에 필요한 라이브러리 및 헤더 파일 설치
> python3-venv : python 가상환경을 생성하기 위한 패키지 설치
Github Clone 받기
$ ssh-keygen -t rsa -b 4096 : SSH 키를 생성하는 명령
> 이 명령은 보안을 강화하기 위해 사용되며 GitHub와 같은 Git 호스팅 서비스를 사용하는 경우 SSH 키를 등록하여 인증하는 데 사용됩니다. SSH 키를 사용하면 매번 사용자 이름과 비밀번호를 입력하지 않고도 로그인하고 코드를 푸시할 수 있으며, 인증 과정에서 추가적인 보안 측면을 제공합니다.
위 명령을 실행하면 RSA 알고리즘과 4096비트 길이의 SSH 키 쌍이 생성됩니다. 이 키 쌍은 공개 키(id_rsa.pub)와 개인 키(id_rsa)로 구성됩니다. 공개 키는 GitHub나 다른 Git 호스팅 서비스에 등록되어 해당 계정과 연결됩니다. 개인 키는 로컬 컴퓨터에 보관되어 프라이빗한 소유이며, 인증 시에 사용됩니다.
따라서, github clone을 사용하고자 하고 SSH 키를 등록하지 않은 경우, ssh-keygen을 통해 SSH 키를 생성하고 GitHub 계정에 공개 키를 등록해야 합니다. 이를 통해 로컬 환경에서 SSH를 통해 GitHub과의 인증이 가능하게 됩니다.
$ cat /home/ubuntu/.ssh/id_rsa.pub
> cat : 안에 있는 정보를 꺼내오는 명령어
ssh-rsa 부터 ip-172-31-40-101 까지 복사
$ git clone [SSH 주소]
$ python3 -m venv venv
> 3 붙여줘야 함
> ls 눌러보면 venv 폴더가 생성되어 있음
$ source venv/bin/activate : 가상환경 진입
$ pip install -r requirements.txt : 패키지 설치
내가 만난 문제
pip install -r requirements.txt 버전 문제
ubuntu@ip-172-31-40-101:~/drf_todolist/venv$ cd .. ubuntu@ip-172-31-40-101:~/drf_todolist$ source venv/bin/activate (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$ pip install -r requirements.txt Ignoring asgiref: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring certifi: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring charset-normalizer: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring django-cors-headers: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring django: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring djangorestframework-simplejwt: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring djangorestframework: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring idna: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring pyjwt: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring python-decouple: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring pytz: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring requests: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment Ignoring sqlparse: markers 'python_version >= "3.11" and python_version < "4.0"' don't match your environment Ignoring tzdata: markers 'python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32"' don't match your environment Ignoring urllib3: markers 'python_version >= "3.11" and python_version < "4"' don't match your environment (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$ ^C (venv) ubuntu@ip-172-31-40-101:~/drf_todolist$
현재 출력에서는 Python 버전이 3.11 이상이 필요하며 4.0 미만이 되어야 한다고 명시되어 있습니다.
현재 사용 중인 Python 버전 확인: python --version 명령을 실행하여 현재 사용 중인 Python 버전을 확인합니다.
Python 버전이 3.11 미만인 경우:Poetry를 사용하는 경우, pyproject.toml 파일에서 python 섹션을 찾아 원하는 파이썬 버전으로 수정합니다.가상 환경을 삭제하고 새로운 가상 환경을 만들어야 할 수도 있습니다.
Python 버전이 3.11 이상인 경우:Python 가상 환경을 다시 만들어야 할 수도 있습니다. 현재 가상 환경에는 버전 제한이 있는 패키지가 설치되어 있을 수 있으므로 새로운 가상 환경을 만들어야 합니다.
Poetry를 사용하는 경우, pyproject.toml 파일에서 python 섹션을 찾아 현재 사용 중인 파이썬 버전과 일치하도록 수정합니다.
$ nano requirements.txt : nano 편집기에서 버전 수정
> nano 편집기 수정 저장하는 법
1. 수정이 완료되면, Ctrl + O 를 눌러 변경사항 저장
2. Enter 키를 눌러 파일 이름 확인
3. Ctrl + X 를 눌러 편집기 종료
같은 방식으로 nano .env를 입력하여 SECRET_KEY를 넣어준 후,
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver 0.0.0.0:8000
인바운드 규칙에서 8000 포트 추가
MYSQL 사용시 해당 포트 추가
DisallowedHost at /
Invalid HTTP_HOST header : You may need to add to ALLOWED_HOSTS.
settings.py 수정
settings.py:
# 변경
DEBUG = False
# 추가
ALLOWED_HOSTS = [
"localhost",
"54.180.101.71", # 본인 EC2의 퍼블릭IP
]
STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = 'static/'
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'
Gunicorn과 Nginx
- gunicorn:
- Django와 같은 웹 애플리케이션을 실행하는 서버
- Nginx:
- 정적 파일 서비스와 프록시 서버 기능을 수행하는 웹 서버
- 정적 파일 서비스는 웹 사이트의 이미지, CSS, JavaScript와 같은 정적 파일을 빠르게 제공
- 프록시 서버는 클라이언트 요청을 받아 애플리케이션 서버(예: gunicorn)로 전달
- 또한 로드 밸런싱과 SSL/TLS 암호화와 같은 기능도 제공
프로덕션 환경에서는 Nginx를 앞단에 위치시켜 정적 파일 제공 및 로드 밸런싱을 담당하고
Nginx는 요청을 애플리케이션 서버(gunicorn)로 전달하여 동적인 처리를 수행함
이렇게 함으로써 보안, 성능 및 확장성을 향상시킬 수 있음
Gunicorn
$ pip install gunicorn
$ sudo vim /etc/systemd/system/gunicorn.service
> vim 텍스트 편집기 사용하는 법
i : 편집 모드로 전환
esc : 편집 모드 종료
:wq : 저장하고 종료
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data WorkingDirectory=/home/ubuntu/{루트폴더이름} ExecStart=/home/ubuntu/{루트폴더이름}/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock {프로젝트이름}.wsgi:application
[Install]
WantedBy=multi-user.target
$ sudo systemctl enable gunicorn : 인스턴스 시작시 자동시작
$ sudo systemctl start gunicorn : 지금 시작
$ sudo systemctl status gunicorn : 상태
> active (running) 이 떠야 하는데 failed 떠버림
내가 만난 문제
루트 폴더 이름 잘못 입력
$ sudo vim /etc/systemd/system/gunicorn.service
> 명령어로 편집기 재 진입 후 재 설정
Nginx
$ sudo apt install nginx
$ sudo vim /etc/nginx/sites-available/{프로젝트이름}
편집기에서 아래 내용 본인에 맞게 입력
server {
listen 80;
server_name {your_domain_or_ip};
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock;
}
location /static {
root /home/ubuntu/{루트폴더이름}/;
}
location /media {
root /home/ubuntu/{루트폴더이름}/;
}
}
$ sudo ln -s /etc/nginx/sites-available/{프로젝트이름} /etc/nginx/sites-enabled/
> Nginx 사이트 구성 파일 활성화
$ sudo nginx -t : Nginx 설정 파일 테스트
$ sudo systemctl restart nginx : Nginx 서비스 재시작
$ sudo systemctl status nginx : Nginx 서비스 상태 확인
권한 문제
$ tail -f /var/log/nginx/error.log : Nginx 웹 서버의 오류 로그 파일 확인
$ namei -nom /home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock : 파일 정보 출력
$ chmod 755 ~/{루트폴더이름}/
$ chmod 755 ~
> chmod(change mode) : 리눅스 및 유닉스 시스템에서 파일 및 디렉토리의 퍼미션(권한)을 변경하는 명령
사용법: chmod [퍼미션 숫자] [파일 또는 디렉토리]
읽기, 쓰기, 실행 권한(7)
그룹 및 기타 사용자에게 읽기 및 실행 권한(5)
$ python manage.py collectstatic : static 파일 복사
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
어드민 페이지 확인! 은 Not Found
[warn] 4038#4038: conflicting server name "your_domain_or_ip" on 0.0.0.0:80, ignored
server_name {your_domain_or_ip};
이것을 변경하지 않아서 생긴 문제였다;
설정 후 다시 어드민 페이지 확인 OK!
할일
- 프론트엔드를 AWS S3 강의를 참고해서 배포해주세요
- EC2 서버에 AWS Load Balancer 강의를 참고해서 로드밸런서를 달아주세요
- Route53 강의를 참고해서 도메인을 달아주세요
- HTTPS를 달아주세요!
Admin CSRF 해결방법
settings.py:
CSRF_TRUSTED_ORIGINS = [
'아이피 또는 도메인',
]
gunicorn 설정파일
ForwardedAllowIPS=* 추가
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/{루트폴더이름}
ExecStart=/home/ubuntu/{루트폴더이름}/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock {프로젝트이름}.wsgi:application
Environment="DJANGO_SETTINGS_MODULE={프로젝트이름}.settings"
RuntimeDirectory=gunicorn
ForwardedAllowIPS=*
[Install]
WantedBy=multi-user.target
nginx설정파일
proxy_set_header Referer $http_referer; 추가
server {
listen 80;
server_name {your_domain_or_ip};
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/{루트폴더이름}/{프로젝트이름}.sock;
proxy_set_header Referer $http_referer;
}
location /static {
root /home/ubuntu/{루트폴더이름}/;
}
location /media {
root /home/ubuntu/{루트폴더이름}/;
}
}
완료 후 필수
sudo service gunicorn restart
sudo service nginx restart
'AWS' 카테고리의 다른 글
aws (0) | 2023.05.29 |
---|---|
AWS RDS DB 연동하기 (1) | 2023.05.23 |
AWS의 모든 것 1강 (2) | 2023.05.07 |
AWS Elastic Beanstalk 애플리케이션 생성 설정 (0) | 2023.05.03 |
AWS 비밀번호 표시 없애기 (1) | 2023.05.03 |