티스토리 뷰

오늘은 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 서버 구성, 오류 페이지 처리, 로깅까지 실제 서비스 배포에 필요한 핵심 요소들을 경험하며,
단순 개발 환경을 넘어 운영 환경 구축의 실전 감각을 익힐 수 있었던 시간입니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
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
글 보관함