제수기 > EC2_mysql, 배포_staticfile서빙

Eunbi Jo·2025년 2월 7일
1

제수기

목록 보기
85/90
제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈

EC2_mysql 설치

GPT 설명 참고
https://chatgpt.com/share/67a46026-11c0-800d-96a2-34d03228ef52

모바액스텀에 sudo apt-get upadate로 최신화를 시켜주고

mysql 서버 깔기
sudo apt-get install mysql-server -y

리눅스 서비스라고 하는 건 윈도우 서비스처럼 일련의 프로그램을 백그라운드에서 돌리기 위함이다.

sudo systemctl status mysql
이때 뜨는 enabled는 컴퓨터 킬 때마다 실행시키겠다는 의미.

루트 계정의 비밀번호 설정은
sudo mysql_secure_installation

접속해보기
sudo mysql -u root -p

show databases; 이러면 상황 볼 수 있고, 여기서 사용자 만들고 디비 만들고 사용자한테 디비 권한주고 하는걸 여기서 해야함.

root는 원격접속을 허용하지 않는다.

이후에 파이참에서 접속정보를 만들면 된다.

이제 consol에서
show databases;

이제 팀원들끼리 ec2 여러개 만들어서
개발용 db/운영용 db/웹서버/ai 추론서버 이런식으로 역할 정해서 활용하면 좋다.

migration 누군가 잘못하면 다 날라가기 때문에, 백업을 해주면 좋다. 하루에 한번씩.


EC2_배포_staticfile서빙

docker 형태로 배포하기

하려는 일 - 접속 가능한 url 배포

local에 있는 image. push를 dockerhub에 보내고, aws ec2가 이걸 pull 해온다. aws ec1에서는 django가 돌아가고 있다. 그러면 인스턴스를 통해서 url이 있는 곳에서 다 접속할 수 있다. 물론 이때 ec2에 docker가 설치돼 있어야 한다.

준비

  • aws 콘솔 로그인
  • ec2 인스턴스 - id 눌러서 상세 페이지 - public ip 주소로 mobaxterm에 ubuntu username 섹션을 실행해두고, docker desktop도 켜놓자.
  • 저번에 만들어뒀던 django wsgi asgi image를 활용하자. 파이참으로 미리 켜두기.

1. docker hub에 imgae push 하기

아무나 들어오면 push 하면 안 되기 때문에 당연히 인증이 필요하다. 파이참 터미널에 docker login

docker push username/django-wsgi-asgi

다 푸시되고 도커 허브에 가보면 확인할 수 있다. 태그도 할 수 있고. (Repositories에서 확인 가능)

이제 어디서나 pull 로 땡겨서 container로 실행이 가능한 상태가 됐다.

2. ubuntu를 host os로, django 서버 돌리기

윈도우에서는 docker desktop을 사용해서 docker engine, docker runtime 을 설치했다.
리눅스 계열의 ubuntu로 설치하는 건 무지 간단하다.

지금은 ubuntu로 돼있는데, docker 설치하거나 하려면 관리자 권한이 필요하다.

관리자 로그인
sudo su

이렇게 쓰면 일반 ubuntu 사용자로 로그인을 하고, 관리자로 로그인을 하게 되는 거다. 앞의 글자가 root로 바뀐 걸 확인할 수 있다.

도커를 다운로드 하는 패키지 스크립트가 있어서 그걸 그대로 넣어주면 된다

복사한 다음에 붙여넣기

는 shift insert를 해주면 된다.

curl 로 다운받고, bash로 바로 실행하라는 명령어다.

이제 아까 올린 image를 pull 해보자.

docker run -d -p 8000:8000 username/imagename
docker ps -a
해서 실행 후 확인

host os에 docker 설치 -> 거기에 django-wsgi-asgi 라는 container를 하나 돌리고 있는 거다. 이 노란 박스 하나가 컴퓨터 하나. 그리고 여기서 8000번 포트에 django 서버가 하나 구동 중인 거다.

우리가 p 옵션을 준 건, host os에 8000번으로 접속을 하면 이걸 보고 django에 연결을 해주겠다는 거다. window에서는 host os가 window였고 ubuntu에서는 host os가 ubuntu가 된 것 뿐이다. 작동 방식은 똑같다

security group 허가

이제 public ip 주소에 :8000 을 입력하면 창이 뜰까?
아니다.

ec2 안에 리눅스 내부 보안벽이 있고, aws의 security gruop이 있다. security group이 허가를 해줘야 열린다.

ec2의 security group에서 들어오는 인바운드 요청을 허가하는 설정을 해보자.

add rule을 하고 아래와 같이 지정해준다. 어디서나 접속이 가능하게 하는 anywhere-IPv4를 선택해준다.

규칙 저장을 하면, 8000 포트가 생긴 걸 확인할 수 있다.

그러고 나서 다시 id+:8000 입력해보면 이제 장고의 오류페이지가 뜨게 된다.

이건 왜 이럴까?

allowed host

  • settings.py에서 debug = False로 설정을 바꿔준다.
    그래야 에러창이 사용자들에게 안 보인다.
    allowed host에는 id를 문자열 형태로 넣어준다.

그러면 이제 설정이 바뀌었는데, 이 사실을 ec2에게 알려야 한다. image를 다시 말아준다. 터미널에서

docker build -t jovytree/imagename .
docker push username/imagename

이렇게 하고 나면 docker hub에서 push가 된 걸 확인할 수 있다.

지금 돌고 있는 container를 중단하고,

docker pull username/imagename을 해준다.
아까 했던 run으로 실행
docker ps -a으로 확인

에러 메시지 엔딩.. 아직 수업진도 따라가야 할 게 많은데.. django app.zip 까지는 가지도 못했다. -> 오타때문이었다. 해결.


django.app 을 파이참으로 실행

static 파일을 홈페이지에서 사용하려면?

  • settings.py 에 아래와 같은 설정을 준다.

  • 그렇게 해놓고 index_html에서 static 태그를 줘서 로드를 하면 된다.

  • gunicorn으로 uvicorn 프로세스를 멀티로 실행하는 구조.

  • image를 말 때 requirement.txt를 통해서 필요한 python 패키지를 쓴다.

그러면 이제 도커 이미지로 말아서 실행해보면 된다.
docker build -t username/containername .

기존에 돌고 있는 runserver는 꺼주고, run을 돌려보자.
docker run -d -p 8000:8000 username/containername

docker pas -a 로 잘 됐는지 확인

gunicorn은 static 파일에 대한 요청을 무시함. 클라우드상에서 봐도 그렇다.

그래서 whitenoise package를 통해서 정적 파일을 넘길 수 있게 해줘야 한다.

whitenoise package

  • requirements.txt에 whitenoise 추가

  • 그리고 django_env(가상환경)에도 설치해주자.
    터미널에 pip install whitenoise

이제 settings.py에 whitenoise 설정하자.

  • settings.py의 MIDDLEWARE에는
    'whitenoise.middleware.WhiteNoiseMiddleware',
    추가

  • settings.py의 STATIC 쪽에는

  
  STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  STATIC_URL = '/static/'
  STATICFILES_DIRS = [BASE_DIR / 'static']
  STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

추가

asgi.py 파일에도 추가로 whitenoise 설정

이제 모아주는 작업을 한다.
터미널에 python manage.py collectstatic

  • 그리고 나중에 ec2로 배포할 것까지 생각해서, settings.py의 ALLOWED_HOST에
    = [
    'localhost',
    'ec2 인스턴스 퍼블릭 IP'
    ]
    추가

  • 이제 이대로 한번 이미지 말기
    docker build -t username/containername .

  • docker image 확인
    docker ps -a

  • 기존에 만들어둔 거 삭제

  • 이제 방금 만든 이미지를 run하고 확인

접속파일 서빙용으로 whitenoise가 많이 쓰이고 있는데, 이게 보통 WSGI 용이다.
그런데 우리는 ASGI를 동시에 쓰고 있다.
그래서...

blacknoise 패키지

  • ASGI용으로 그냥 만들어졌다.
    blacknoise는 whitenoise보다 훨씬 간단하다. 미들웨어, 스테틱 파일 모아주기 등의 작업이 필요가 없다.

  • 터미널에 pip install blacknoise

  • requirments.txt에 blacknoise 추가

  • asgi.py에 설정 추가

이미지 빌드하고 하는 건 위와 같음.
파이썬에서 docker 푸시하고,
모바액스텀에서 docker run -d -p 8000:8000 username/containername 적어주면 된다.


근데 이 static 파일들은 서버에서 제공하는 거다. 기본적으로 제공해야 하는 img나 js, css 이런 것만 그렇게 하시고 실제 업로드 하는 사진. 상품 사진. 이런 건 S3에 올려서 해라. AWS의 파일 저장소를 쓰기 때문에 구니콘이나 이런 게 상관이 없다.

0개의 댓글