티스토리 뷰
LG U+ Why Not SW 부트캠프 5기
AWS Flask 운영환경 배포 실습 - MobaXterm 기반 서버 세팅부터 Gunicorn + Nginx 구성까지
jlye0n 2025. 4. 7. 17:11오늘은 MobaXterm을 이용한 AWS EC2 Ubuntu 서버 설정을 시작으로,
Flask 프로젝트(Pybo)를 운영 환경 수준으로 배포하기 위한 전 과정을 실습했습니다.
가상환경 구성부터 설정 파일 분리, Gunicorn 서비스 등록, Nginx 리버스 프록시 설정, 오류 페이지 처리, 로깅 설정까지 실제 서비스 환경을 구성해보며 웹 애플리케이션 배포의 흐름을 익힐 수 있었습니다.
1. MobaXterm으로 서버 접속 및 환경 진입
# MobaXterm에서 EC2 인스턴스 접속 후
cd ~/venvs/myproject/bin
. activate
cd ~/projects/myproject/
2. config 디렉터리 구성 및 환경설정 분리
mkdir config
# config/default.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
- config/development.py → 개발용 설정
- config/production.py → 운영용 설정
from config.default import *
SQLALCHEMY_DATABASE_URI = 'sqlite:///{}'.format(os.path.join(BASE_DIR, 'pybo.db'))
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = '운영 비밀 키'
3. 플라스크 앱에 환경변수 적용
pybo/__init__.py 파일에서 다음 코드 추가:
app.config.from_envvar('APP_CONFIG_FILE')
개발 시
set APP_CONFIG_FILE=c:\projects\myproject\config\development.py
운영 서버에서
export APP_CONFIG_FILE=/home/ubuntu/projects/myproject/config/production.py
4. 프로젝트 커밋 및 라이트세일 서버에서 git pull
git add *
git commit -m "config 설정 추가"
git push
# 운영 서버에서는 git pull
cd ~/projects/myproject
git pull
5. myproject.sh 실행 스크립트 작성
/home/ubuntu/venvs/myproject.sh
#!/bin/bash
cd ~/projects/myproject
export FLASK_APP=pybo
export FLASK_DEBUG=true
export APP_CONFIG_FILE=/home/ubuntu/projects/myproject/config/production.py
. ~/venvs/myproject/bin/activate
이후 . myproject.sh 명령으로 환경 설정 + 가상환경 진입을 한 번에 처리 가능
6. Gunicorn 설치 및 실행
pip install gunicorn
gunicorn --bind 0:5000 "pybo:create_app()"
또는 소켓 방식:
gunicorn --bind unix:/tmp/myproject.sock "pybo:create_app()"

7. Gunicorn을 시스템 서비스로 등록
# 환경변수 파일 작성
/home/ubuntu/venvs/myproject.env
FLASK_APP=pybo
FLASK_DEBUG=true
APP_CONFIG_FILE=/home/ubuntu/projects/myproject/config/production.py
# 서비스 설정
/etc/systemd/system/myproject.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/projects/myproject
EnvironmentFile=/home/ubuntu/venvs/myproject.env
ExecStart=/home/ubuntu/venvs/myproject/bin/gunicorn \
--workers 2 \
--bind unix:/tmp/myproject.sock \
"pybo:create_app()"
[Install]
WantedBy=multi-user.target
# 서비스 실행 및 등록
sudo systemctl start myproject.service
sudo systemctl enable myproject.service
8. Nginx 설치 및 리버스 프록시 구성
sudo apt install nginx
# /etc/nginx/sites-available/myproject
server {
listen 80;
server_name 3.39.117.103;
location = /favicon.ico { access_log off; log_not_found off; }
location /static {
alias /home/ubuntu/projects/myproject/pybo/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/myproject.sock;
}
}
# 심볼릭 링크 생성
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo systemctl restart nginx
9. 404 오류 처리 및 커스터마이징
pybo/__init__.py
from flask import render_template
def page_not_found(e):
return render_template('404.html'), 404
app.register_error_handler(404, page_not_found)
templates/404.html
{% extends 'base.html' %}
{% block content %}
<div class="text-center">
<h1 class="display-1">404</h1>
<p>페이지를 찾을 수 없습니다.</p>
<a href="/" class="btn btn-primary">홈으로 돌아가기</a>
</div>
{% endblock %}
10. 로깅 설정으로 서버 상태 추적
config/production.py
from logging.config import dictConfig
dictConfig({
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
}
},
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/myproject.log'),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'default',
},
},
'root': {
'level': 'INFO',
'handlers': ['file']
}
})
mkdir logs
echo logs >> .gitignore
views/main_views.py
from flask import current_app
@bp.route('/')
def index():
current_app.logger.info("INFO 레벨 로깅 테스트")
return redirect(url_for('question._list'))
# 로그 확인
cd logs
tail -f myproject.log
11. 결론 및 정리
오늘은 AWS EC2 Ubuntu 환경에서 MobaXterm을 활용해 운영 서버를 설정하고,
Flask 기반 웹 애플리케이션을 Gunicorn + Nginx 조합으로 서비스화하는 전 과정을 실습했습니다.
설정 파일 분리, WSGI 서버 구성, 오류 페이지 처리, 로깅까지 실제 서비스 배포에 필요한 핵심 요소들을 경험하며,
단순 개발 환경을 넘어 운영 환경 구축의 실전 감각을 익힐 수 있었던 시간입니다.
'LG U+ Why Not SW 부트캠프 5기' 카테고리의 다른 글
| Python Streamlit 실습 - 웹 기반 대시보드부터 파일 업로드, 인터랙션 구현까지 (0) | 2025.05.09 |
|---|---|
| AWS EC2 서버 설정부터 Pybo 실행까지 - MobaXterm으로 완전 정복 (0) | 2025.04.04 |
| Git 입문 정리 - 로컬 저장소 생성부터 커밋, GitHub 업로드까지 (0) | 2025.04.03 |
| Flask 웹 프로젝트 - Q&A 서비스 개발 CRUD 구현과 템플릿 처리 (0) | 2025.04.03 |
| Flask 웹 프로젝트 실습 정리: 구조화, 라우팅, 템플릿, 폼 처리까지 (0) | 2025.04.03 |
