1. 목표: Django 서버를 두 개로 나눠 받고 Nginx로 분산하기
기존 구조는:
- Nginx
- → Gunicorn (Django) 1개
- →
127.0.0.1:8000으로만 연결
오늘 목표는:
- Gunicorn 프로세스 2개 (8000, 8001)
- Nginx
upstream으로 두 포트에 로드 밸런싱
2. 기존 Nginx 설정 확인 (quizai.juwonpark.me)
원래 quizai.juwonpark.me Nginx 설정은 대략 이렇게 되어 있었다.
server {
listen 80;
server_name quizai.juwonpark.me 3.38.116.255 127.0.0.1 localhost;
client_max_body_size 100M;
client_body_timeout 300s;
client_body_buffer_size 512k;
location = /favicon.ico {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/staticfiles/quiz_app/favicon.ico;
access_log off;
log_not_found off;
}
location /static/ {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/staticfiles/;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location /media/ {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/media/;
add_header Cache-Control "public, max-age=604800";
access_log off;
expires 7d;
}
location / {
proxy_pass http://127.0.0.1:8000; # 단일 포트
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_request_buffering off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
즉, 한 포트(8000)에만 프록시하고 있었음.
3. Nginx에 upstream 추가해서 로드 밸런싱 적용
여기에 로드 밸런서 역할을 시키기 위해 upstream 블록을 추가하고,
proxy_pass 대상을 127.0.0.1:8000 → quiz_backend 로 변경했다.
# 1) server 블록 위에 upstream 추가
upstream quiz_backend {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
# 2) server 블록의 location / 수정
server {
listen 80;
server_name quizai.juwonpark.me 3.38.116.255 127.0.0.1 localhost;
client_max_body_size 100M;
client_body_timeout 300s;
client_body_buffer_size 512k;
location = /favicon.ico {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/staticfiles/quiz_app/favicon.ico;
access_log off;
log_not_found off;
}
location /static/ {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/staticfiles/;
add_header Cache-Control "public, max-age=31536000, immutable";
}
location /media/ {
alias /home/ubuntu/Q_park_final/Quiz_AI/testpro/media/;
add_header Cache-Control "public, max-age=604800";
access_log off;
expires 7d;
}
location / {
proxy_pass http://quiz_backend; # ← upstream 이름으로 변경
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_request_buffering off;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
적용 순서:
sudo nginx -t
sudo systemctl reload nginx
4. Gunicorn systemd 서비스 두 개로 분리
4.1 기존 quizai.service 오타 수정
기존 서비스 파일:
[Unit]
Description=Quiz_AI Django Service
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/Q_park_final/Quiz_AI/testpro
Environment="DJANGet_SETTINGS_MODULE=mysite.settings"
ExecStart=/home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/gunicorn \
mysite.wsgi:application \
--bind 127.0.0.1:8000 \
--workers 3
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
여기서 Environment 부분에 오타가 있어서 수정:
Environment="DJANGO_SETTINGS_MODULE=mysite.settings"
그리고 Description만 살짝 바꿔서 정리:
[Unit]
Description=Quiz_AI Django Service (8000)
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/Q_park_final/Quiz_AI/testpro
Environment="DJANGO_SETTINGS_MODULE=mysite.settings"
ExecStart=/home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/gunicorn \
mysite.wsgi:application \
--bind 127.0.0.1:8000 \
--workers 3
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
4.2 quizai-2.service 생성 (포트 8001)
서비스 파일을 그대로 복사해서 두 번째 인스턴스를 만들었다.
sudo cp /etc/systemd/system/quizai.service /etc/systemd/system/quizai-2.service
sudo vim /etc/systemd/system/quizai-2.service
내용에서 포트만 8001로 변경:
[Unit]
Description=Quiz_AI Django Service (8001)
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/Q_park_final/Quiz_AI/testpro
Environment="DJANGO_SETTINGS_MODULE=mysite.settings"
ExecStart=/home/ubuntu/Q_park_final/Quiz_AI/.venv/bin/gunicorn \
mysite.wsgi:application \
--bind 127.0.0.1:8001 \
--workers 3
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
4.3 systemd 리로드 + 서비스 시작
sudo systemctl daemon-reload
sudo systemctl enable --now quizai.service quizai-2.service
sudo systemctl status quizai.service
sudo systemctl status quizai-2.service
정상일 때 journalctl -u 로그:
[INFO] Listening at: http://127.0.0.1:8000 ...
[INFO] Listening at: http://127.0.0.1:8001 ...
그리고 ss로 포트 확인:
sudo ss -lntp | grep 800
7. 오늘 작업 요약
- Nginx에
upstream quiz_backend추가해서127.0.0.1:8000,127.0.0.1:8001두 포트로 로드 밸런싱 설정 quizai.service오타 수정 (DJANGet_SETTINGS_MODULE→DJANGO_SETTINGS_MODULE)quizai-2.service생성해서 Gunicorn 두 번째 인스턴스를 8001 포트에 바인딩systemctl/journalctl/ss명령으로 서비스와 포트 상태 확인
이번에 해본 셋업은 나중에 EC2 여러 대로 확장하거나, ALB 환경으로 넘어갈 때도 기본이 되는 패턴이라, 오늘 작업은 “미니 로드밸런서 실습” 느낌으로 잘 정리된 하루였다.