1. 준비
1. 인스턴스 시작 - AWS
Ubuntu-20.04 or 22.04
아키텍처 : 64비트
인스턴스 유형 : 프리티어 사용가능
키 페어 설정 : 기존 없으면 생성
스토리지 구성 : 무료 30기가 설정
2. server 폴더에 server_starter 생성
#!/bin/sh
echo "1. [ubuntu] : server connect"
read value
if [ ${value} -eq 1 ]
then
ssh -i "{pem키 파일.pem}" ubuntu@{퍼블릭 IPv4 주소}
fi
#! 는 스크립트를 실행할 쉘을 지정하는 선언문이다.
쉘 스크립트를 해당 쉘에서 해석하여 실행한다.
read value : 입력되는 값을 읽어서, -eq 1 : 1과 같으면 then : 실행한다.
ssh프로토콜을 통한 접속명령어이고, pem파일을 기입하고 운영체제와 ip주소를 입력한다.
ssh : Secure Shell, 네트워크상의 다른 컴퓨터에 로그인하거나 원격시스템에서 명령을 실행할 수 있도록 하는 프로토콜으로, AWS와 같은 클라우드 서비스는 인스턴스 서버에 접속하여 해당 머신에 명령을 내리기 위해서 SSH을 통한 접속을 해야한다.
-i : 공개키 인증을 위해 개인키 id가 읽히는 파일을 선택, 주로 비밀키를 읽어올 identity파일을 선택한다.
chmod 400 {pem키 파일.pem}
ls-al으로 파일 권한을 확인하고,
서버 보안을 위해서 pem키에 400 권한을 부여한다.
권한 : read(4), write(2), execute(1)
400권한은 4/0/0으로 나에게만 읽기 권한이 있는 것이다.
2. 서버
pem키와 server_starter가 있는 디렉토리 위치에서 ./server_starter로 작성한 서버스타터를 실행한다.
서버스타터를 통해 ssh -i ~~~을 명령어가 실행되도록 하면,
터미널에 ubuntu@ip-00-000-000-00:~$ 처럼 표시되는데 실행이 잘 된 것이다.
pwd => /home/ubuntu
python --version
python3 --version
파이썬 버전 확인한다.
python 명령어 대신 python3으로 써야 한다면, .bashrc에서 alias 지정해주는 것이 좋다.
vi .bashrc
####
alias python='python3'
alias pip='pip3'
#####
:wq
####
source .bashrc
vi .bashrc 편집기 열기
i 편집 -> alias 작성
esc -> :wq 저장하고 나가기
source .bashrc 으로 적용시키기
python -m venv venv
source venv/bin/activate
가상환경 생성, 실행
git clone {프로젝트}
프로젝트 clone해서 가져온다.
3. 인스턴스 보안
현재 포트범위 22만 기본적으로 열려있어서 ssh 통신만 가능한 상태이다.
인스턴스 보안 - 보안그룹 - 인바운드 규칙에 8000, 80(Http), 443(Https) 추가해준다.
프로젝트 settings.py의 allowed_hosts = [] 부분에 허용해준다.
할당된 EC2 인스턴스의 IP 주소를 입력해준다. (우선적으로 ['*'] 지정)
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
runserver 하면 퍼블릭IP:8000 접속 가능하다.
runserver로 서버를 돌리면 django.core.servers.basehttp에 있는 python 제공 http server을 열게되는데, https를 사용하면 예외처리를 하게 된다. 보안처리를 최대한 생략한 것이다.
"""
This is a simple server for use in testing or debugging Django apps. It hasn't
been reviewed for security issues. DON'T USE IT FOR PRODUCTION USE!
"""
django.core.servers.basehttp에 보안적인 이유로 메인서버로 사용하지 말도록 하라는 경고가 있다.
또한 django는 기본적으로 single-line program으로 싱글 스레드로 요청을 순차적으로 진행 한다.
https에 대한 문제는 nginx, 싱글스레드에 대한 문제는 gunicorn으로 처리할 것이다.
python으로 코드를 짜는 django는 web server와 web application 간에 WSGI 미들웨어가 존재한다.
WSGI : Web Server Gateway Interface
파이썬에만 종속되는 인터페이스
웹서버가 직접적으로 django와 통신할 수 없기 땜누에 사이에서 실행되어 웨서버와 장고를 연결한다. 웹서버가 전달받은 사용자의 요청을 WSGI server에서 처리하여 django로 넘겨주고 django가 넘겨준 응답을 WSGI server가 받아서 웹서버에 전달한다.
User - Web server - WSGI Server - Django
파이썬 스크립트(웹 어플리케이션)가 웹 서버와 통신하기 위한 인터페이스로 uwsgi, gunicorn 등이 있다.
4. gunicorn
gunicorn 설치 : https://docs.gunicorn.org/en/stable/install.html
Installation — Gunicorn 20.1.0 documentation
You may also want to install Eventlet or Gevent if you expect that your application code may need to pause for extended periods of time during request processing. Check out the design docs for more information on when you’ll want to consider one of the a
docs.gunicorn.org
pip install gurnicorn
gunicorn 설치
gunicorn --bind 0.0.0.0:8000 {마스터 앱}.wsgi:application
마스터 앱은 manage.py가 있는 디렉토리(프로젝트)이다.
이렇게 하면 서버가 bind 되어 실행된다. python manage.py runserver 0.0.0.0:8000을 대체한 것이다.
백그라운드에서 실행할 수 없는 상태이다.
sudo vi /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/{프로젝트 폴더}
ExecStart=/home/ubuntu/{프로젝트 폴더}/venv/bin/gunicorn \
--workers 3 \
--bind 127.0.0.1:8000 \
{마스터 앱}.wsgi:application
[Install]
WantedBy=multi-user.target
백그라운드 실행을 위해 gurnicorn.service 설정을 해서 서버가 재시작할 때 gunicorn도 실행되도록 한다.
WorkingDirectory는 프로젝트 폴더를 지정하고,
ExecStart에서는 venv 기준으로 경로를 지정하면 된다.
위 내용으로 gunicorn.service를 수정한다.
sudo systemctl daemon-reload
서비스를 새로 등록하거나 수정할 경우 데몬을 reload 해주어야 한다.
sudo systemctl start gunicorn #서비스 실행
sudo systemctl enable gunicorn #서버 재시작시 자동으로 실행
sudo systemctl status gunicorn.service #상태보기
# sudo systemctl stop gunicorn # 중지
# sudo systemctl restart gunicorn # 재시작
start, enable, status 과정으로 서비스를 실행하고 등록한다.
django와 gunicorn을 연동했다.
5.nginx
sudo apt-get update
sudo apt-get install -y nginx
nginx 설치
sudo vi /etc/nginx/sites-available/django_test
server {
listen 80;
server_name {서버IP주소};
location /static/ {
root /home/ubuntu/{프로젝트 폴더}/staticfiles/;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
파일 수정
sudo ln -s /etc/nginx/sites-available/django_test /etc/nginx/sites-enabled
사이트 추가
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
80 포트 프로세서 종료
sudo systemctl restart nginx
systemctl status nginx.service
nginx restart
status 확인
'Back-end > Django' 카테고리의 다른 글
REST API (N:M) (0) | 2022.11.15 |
---|---|
REST API (1:N) (0) | 2022.11.15 |
REST API, 1:N, M:N - movie, actor, review (0) | 2022.10.21 |
Fixtures - dumpdata, loaddata (0) | 2022.10.12 |
Django M:N 관계 - User끼리의 follow 구현하기 (0) | 2022.10.12 |