Notice
Recent Posts
Recent Comments
Link
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags more
Archives
Today
Total
관리 메뉴

최용우

하나의 서버에서 2개 이상 django 프로젝트 배포하기 본문

장고

하나의 서버에서 2개 이상 django 프로젝트 배포하기

용우쨩 2022. 2. 12. 18:54

나는 AWS lightsail 3.5$ ubuntu를 사용중이다.

근래 만들고 싶은 프로젝트가 많아졌고 동시에 여러개의 서버를 작동시키고 싶었다.

프로젝트마다 인스턴스를 구입하려면 돈이 많이 든다.(난 실제로 그렇게 해야하는 것인줄 알았다.)

 

Nginx로 배포를 시작하면서(프론트 개발자에게 안정적인 api 제공)

Nginx, Gunicorn 조합으로 하나의 인스턴스(1대의 컴퓨터)에서 여러개 프로젝트를 배포하는 방법을 공부했다.

구글링을 해보았으나 나의 문제를 명쾌하게 해결해 줄만한 자료는 보이지 않았다.

 

결국, stackoverflow에서 해답을 찾았다.

아래는 참조 링크다.

https://stackoverflow.com/questions/62264100/serving-two-django-apps-with-nginx

 

방법

대략적인 flow는 간단하다.

 

  1. gunicorn을 통한 소켓 생성(각각의 프로젝트마다)

  2. Nginx 설정 파일에 포트번호를 다르게 등록

 

먼저번에 작성한 포스팅에서 gunicorn 소켓 생성방법을 알아보았다. 각각의 프로젝트마다 다른 gunicorn.service파일을 만들어주어야 하는게 차이점이다. 나는 todolist와 lottery라는 프로젝트 두개를 배포하고 싶은 상황이다.

 

1. /etc/systemd/system 디렉토리로 이동

cd /etc/systemd/system

2. 서비스 파일 생성(배포하고 싶은 프로젝트 갯수만큼 생성)

sudo vi gunicornlottery.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/projects/lottery
EnvironmentFile=/home/ubuntu/venvs/lotteryvenv/lotteryvenv.env
ExecStart=/home/ubuntu/venvs/lotteryvenv/bin/gunicorn \
        --workers 2 \
        --bind unix:/home/ubuntu/projects/lottery/run/gunicornlottery.sock \
        config.wsgi:application

[Install]
WantedBy=multi-user.target

 

위의 내용 복붙. 물론 개인 환경에 맞추어야 한다. 각각의 의미는 지난 포스팅 참조

 

두번째 service 파일 생성

sudo vi gunicorntodolist.service

 

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/projects/todolist
EnvironmentFile=/home/ubuntu/venvs/todolist/todolist.env
ExecStart=/home/ubuntu/venvs/todolist/bin/gunicorn \
        --workers 2 \
        --bind unix:/home/ubuntu/projects/todolist/run/gunicorntodolist.sock \
        config.wsgi:application

[Install]
WantedBy=multi-user.target

 

위의 내용 복붙

 

두개의 .service 파일이 만들어졌으니 gunicorn에 등록하면 된다.

$sudo systemctl start gunicornlottery.service
$sudo systemctl start gunicorntodolist.service

프로젝트의 run 디렉토리에 .sock 파일이 생긴것을 확인할 수 있다.

 

 

3. Nginx 설정

두개 이상의 프로젝트를 배포할때는 포트 번호를 다르게 배포해야 한다. 그래야 컴퓨터 입장에서는 어느 서버로 요청을 보내줘야 할지 인식 할 수 있기 때문이다.

server {
        listen 9000;
        server_name 15.164.62.156;

        location = /favicon.ico { access_log off; log_not_found off; }
        location /static {
                alias /home/ubuntu/projects/lottery/static;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/projects/lottery/run/gunicornlottery.sock;
        }

}
server {
        listen 8000;
        server_name 15.164.62.156;

        location = /favicon.ico { access_log off; log_not_found off; }

        location /static {
                alias /home/ubuntu/projects/todolist/static;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/projects/todolist/run/gunicorntodolist.sock;
        }
}

9000 포트에는 lottery 프로젝트를 매핑하고

8000 포트에는 todolist 프로젝트를 매핑했다.

 

앞으로 Nginx는 해당 포트로 들어오는 요청들을 분기시켜 gunicorn으로 보내줄 것이다. 

예를 들어,

'http://15.164.62.156:9000/생략' 으로 요청되는 http request들은 gunicornlottery.sock을 통해

lottery 장고 프로젝트로 넘어가고

'http://15.164.62.156:8000/생략' 으로 요청되는 http request들은 gunicorntodolist.sock을 통해

todlist장고 프로젝트로 넘어가서 처리될것이다.

 

 

'장고' 카테고리의 다른 글

장고 ReadOnlyField의 쓰임  (1) 2022.02.26
장고 테스트 케이스 사용법  (0) 2022.02.14
Django 시리얼라이저, ReadOnlyField  (1) 2022.02.13
requirements.txt 만들기  (2) 2022.02.09
장고 + Nginx + Gunicorn 배포하기  (2) 2022.02.09