[AWS] AWS에 nginx와 docker로 Django 프로젝트 빌드하기

nginx를 활용하지 않고, 단순히 ec2에서 docker를 실행하면 서버와의 ssh 연결이 끊기면 서버도 끊기기 때문에 nginx를 사용합니다.

이전에 작성한 docker로 djagno 프로젝트 빌드하기에서 django 프로젝트 폴더 이외에 nginx를 설치할 폴더를 만들어 줍니다.

nginx 이미지와 이전에 만든 django 이미지 연결:
django 프로젝트 폴더로 이동 -> vi uwsgi.ini -> 아래 입력

[uwsgi]
socket = /srv/docker-django/django.sock
master = true

processes = 1
threads = 2

chdir = /srv/docker-django
#git clone시 생성되는 폴더 이름(리포지토리 명)
module = python_django_fastcampus.wsgi

logto = /var/log/uwsgi/uwsgi.log
log-reopen = true

vacuum = true

-> cd ..

도커 compose 다운받기 :
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s-uname -m` -o /usr/local/bin/docker-compose

도커 compose 권한 설정 :
sudo chmod +x /usr/local/bin/docker-compose -> docker-compose

nginx 설정:
cd nginx -> vi nginx.conf
아래 입력

user root;
worker_processes auto;
pid /run/nginx.pid;

events {
	worker_connections 1024;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    include /etc/nginx/mime.tpyes;
    default_type application/octet-stream;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSlv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    
    gzip on;
    gzip_disable "msie6";
    
    include /etc/nginx/sites-enabled/*;
}

nginx-app 설정:
nginx 폴더에서 vi nginx-app.conf하여 아래 내용 작성

upstream uwsgi {
    server unix:/srv/docker-django/apps.sock;
}

server {
    listen 80;
    server_name localhost;
    charset utf-8;
    client_max_body_size 128M;
    
    location / {
    	uwsgi_pass	uwsgi;
        include		uwsgi_params;
    }
    
    location /media/ {
    	alias /srv/docker-django/.media/;
    }
    
    location /static/ {
    	alias /srv/docker-django/.static/;
    }
}

Dockerfile 생성:
nginx 폴더에서 vi Dockerfile하여 아래 내용 작성

FROM nginx:latest

COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-app.conf /etc/nginx/sites-available/

RUN mkdir -p /etc/nginx/sites-enabled/\
    && ln -s /etc/nginx/sites-available/nginx-app.conf /etc/nginx/sites-enabled/
    
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

nginx 디렉토리에서 docker 이미지 빌드:
docker build -t docker/nginx .

user가 80번 포트로 접근했을 때 서버내의 80번 포트로 전송하도록 실행:

  • 위에서 nginx의 EXPOSE를 80으로 해줬음

docker run -p 80:80 docker/nginx

nginx가 제대로 실행되기 위해서는 django가 먼저 떠야한다!!
django에 들어있는 socket file을 보고, nginx가 떠야하기 때문!

docker-compose 사용하여 순서대로 컨테이너가 뜨도록 관리:

cd .. 하여 docker-django 프로젝트 폴더로 이동 ->

vi docker-compose.yml하여 아래 내용 작성

# docker compose version3 사용
version: '3'
# services 하위의 내용이 만들고 싶은 컨테이너들이 된다.
services:

    nginx:
    	container_name: nginx
        build: ./nginx
        image: docker-django/nginx
        restart: always
        ports:
            - "80:80"
        volumes:
            # working directory 설정
            - ./python_django_fastcampus:/srv/docker-django
            - ./log:/var/log/uwsgi
        # django 컨테니너를 먼저 실행!
        depends_on:
            - django
            
     django:
    	container_name: django
        build: ./python_django_fastcampus
        image: docker-django/django
        restart: always
        command: uwsgi --ini uwsgi.ini
        volumes:
            - ./python_django_fastcampus:/srv/docker-django
            - ./log:/var/log/uwsgi
            

현재 각각 만들어 놓은 nginx 이미지와 django 이미지가 있어 삭제해주기:

  • 위의 docker-compose.yml을 사용하여 두 이미지를 띄울 수 있음

docker image ls
docker image rm --force (image id)

  • container가 돌고 있으면 삭제가 안되어 container stop 후 삭제

docker ps
docker stop (container id)

docker compse 실행:
-d는 background 실행
docker-compose up -d --build

*** 참고로 폴더명과 asgi.py, settings.py, wsgi.py 내의 폴더명을 잘 맞춰줘야 함!

좋은 웹페이지 즐겨찾기