Gunicorn은 웹 서버 소프트웨어와 Django를 연결하기 위해 필요한 WSGI(web server gateway interface)이다. Nginx는 웹 서버 소프트웨어로 비슷한 것으로 Apache가 있다. Nginx는 성능, 보안 문제를 대처할 수 있게 해주며 클라이언트의 요청에 빠르게 응답할 수 있고 여러명의 사용자가 동시접속을 했을 시 여러 대의 서버로 요청을 분산하는 로드 밸런싱 기능도 제공해 주며 Django가 필요한 요청에 Django를 이용해 컴퓨팅 자원을 효율적으로 쓸 수 있게 해준다.
● Gunicorn 적용
Gunicorn을 위한 도커 이미지 수정
Gunicorn으로 서버를 실행하게 하기 위해 docker-compose.yml 파일의 web 컨테이너 부분을 수정하는데
그 다음은 pip install gunicorn 명령어로 설치하고 pip freeze > requirements.txt로 txt에 추가한 후 docker-compose up --build로 이미지 빌드와 컨테이너 실행을한다.
정적 파일 서비스하기
브라우저가 캐싱되어 있지 않다면 Gunicorn을 실행한 후 css파일들이 제대로 출력되지 않을것이다.
이는 정적 파일인 css나 이미지 파일을 서버에서 제공하지 않고 있기 때문에 생기는 문제다. 위의 사진은 타 사이트에서 받아온 것이기 때문에 그것만 정상적으로 출력되고 나머지는 출력되지 않는다. 이는 static 폴더에 파일이 연결되지 않았기 때문에 생기는 문제로 settings.py 파일을 수정한다.
django_blog_project 폴더의 urls.py 파일도 수정한다. 이는 STATIC_URL이 urls.py에서 처리되도록 하기 위함이다.
실행 중인 컨테이너를 종료후 python manage.py collectstatic으로 blog 파일과 single_pages 폴더 안의 static안의 모든 파일을 복사한 후 _static 폴더를 만든다. 215개의 파일들이 복사되었다고 한다.
그 후 docker-compose up --build로 이미지를 새로 빌드 후 실행 시키면 정상적으로 이미지와 css 파일이 정상적으로 출력되는 것을 확인할 수 있다.
●배포용 도커 파일 만들기
docker-compose 파일을 개발용과 배포용으로 분리
개발용 환경과 배포용 환경을 달리 함으로써 보안과 클라이언트 편의를 도모하고자 한다. 먼저 docker-compose.yml 파일을 복사한 후 docker-compose.dev.yml로 변환한다. 이것이 개발용 환경이고 docker-compose.yml은 배포용 환경이다. 그 후 배포용 환경인 docker-compose.yml 파일에 적절한 수정을 한다.
# 1 : 개발용 환경설정 파일인 .env.dev파일 대신에 .env.prod 파일을 사용하도록한다.
# 2 : PostgreSQL과 관련된 것들은 .env.prod.db 파일에서 관리하도록 한다.
환경설정 파일 분리
.env.dev 파일을 복사 후 .env.prod파일을 만들고 다음과 같이 수정한다. 여기서 시크릿 키를 생성하는 방법은 cmber 터미널에서 python manage.py shell로 Django 쉘을 연 후 from django.core.management.utils import get_random_secret_key를 입력하여 시크릿 키를 얻는다.
DEBUG = 0 은 오류 발생시 브라우저에 오류 메시지를 나타나지 않도록 한다. 사이트 이용자가 굳이 상세한 오류 메시지를 볼 이유가 없을 뿐더러 악의적인 목적을 가진 자에게 취약점을 노출 수 있기 때문이다.
계속해서 .env.prod.db 파일을 새로 만든 후 docker-compose.yml에서 삭제했던 environment 부분을 붙여넣는다. 그 후 POSTGRES_USER,PASSWORD,DB의 뒷부분에 _prod를 붙인다.
.env.prod.db 와 .env.prod.db 파일은 보안상 git으로 관리하면 안 되므로 .gitignore 파일에 2개 파일을 추가한다.
Docker에 변경 사항을 반영하기 위해 기존의 볼륨을 삭제하기 위해 docker-compose down -v 명령어를 입력한다.
배포용 Docker 컨테이너 실행
docker-compose up -d 로 백그라운드에서 docker 이미지를 빌드하고 실행해 보면 Server Error (500)이 뜨는데 이는 migration이 되지 않았기 떄문이다. docker-compose logs로 error를 확인한 후 migration하고 새로운 superuser를 만들어 준다.
● Nginx 적용
또다시 css와 이미지 파일와 같은 static 파일들이 제대로 출력되지 않기 때문에 Nginx를 이용해 해결하기 위해 docker-compose.yml파일을 수정하여 새 컨테이너를 준비한다. Nginx를 쓰는 이유 중에 하나는 정적 페이지는 장고를 거치는 것보다 nginx에서 바로 제공하는 것이 훨씬 빠르고 효율적이기 때문이라고 한다.
# 1: service에 Nginx라는 이름의 컨테이너를 추가한다.
# 2: Nginx 컨테이너를 만들기 위한 파일을 넣을 nginx 폴더를 만든다.
# 3: 컨테이너 종료시 컨테이너의 내용이 사라지는데 Nginx의 volume기능을 이용하면 컨테이너를 다시 실행시 바로 불러올 수 있다. 즉 Django가 아닌 volume에 저장된 정적 파일들을 바로 보내주는 것이다. volume 이름은 static_volume이고 업로드는 파일을 저장하는 media_volume도 추가한다.
# 4: 도메인이나 ip 주소 뒤에 아무것도 쓰지 않는다면 80이 기본값이라고 한다.
# 5: nginx는 web 컨테이너에 의존성을 갖도록 설정한다.
# 6: Django에서 처리한 결과는 8000 포트로 expose하도록 한다. 이는 8000번 포드로 nginx와 web 컨테이너가 정보를 주고 받도록 하기 위함이다.
Docker에서는 Nginx 컨테이너 이미지를 제공한다. 이를 이용하기 위해 nginx 폴더를 만든 후 Dockerfile을 만든다.
# 1: Nginx 이미지 중 최신 버전을 사용하도록 하는 설정이다.
# 2: 이 이미지 안의 default.conf에는 docker가 제공하는 Nginx의 기본 설정값이 들어있다. rm 명령어로 삭제한다.
# 3: 로컬에 새로만든 Nginx 설정 정보(conf.d)를 Nginx 이미지에 복사해 넣는다.
Nginx 설정 정보를 담을 nginx.conf 파일을 nginx폴더에 새로 만들도록한다. Django에서 proxy_pass를 통해 nginx로 오는 내용은 8000 포트로 받고, 서버 외부에서의 요청은 80에서 받도록한다. Nginx에 /static/ 혹은 /media/ 경로로 접근하는 경우 파일을 제공할 수 있도록 static파일과 media 파일이 저장되어 있는 위치를 적는다.
컨테이너 재시작 후 Nginx 설정 반영
docker-compose up을 한 뒤 collectstatic으로 파일들을 정리한 후 static 파일들이 제대로 출력되는지 확인한다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
37. 도메인 연결 (0) | 2022.10.24 |
---|---|
36. 아마존 웹 서비스로 배포! (0) | 2022.10.23 |
34. PostgreSQL 사용 (0) | 2022.10.21 |
33. Docker (0) | 2022.10.18 |
32. 자기소개 페이지 (0) | 2022.10.15 |