102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
"""
|
|
Gunicorn 설정 파일
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
|
|
# 프로젝트 루트 경로 추가
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
import settings
|
|
|
|
# Worker 설정
|
|
workers = settings.GUNICORN_WORKERS
|
|
worker_class = settings.GUNICORN_WORKER_CLASS
|
|
worker_connections = settings.GUNICORN_WORKER_CONNECTIONS
|
|
threads = settings.GUNICORN_THREADS
|
|
|
|
# 서버 바인딩
|
|
bind = f'{settings.HOST}:{settings.PORT}'
|
|
|
|
# 타임아웃 설정
|
|
timeout = settings.GUNICORN_TIMEOUT
|
|
keepalive = settings.GUNICORN_KEEPALIVE
|
|
graceful_timeout = settings.GUNICORN_GRACEFUL_TIMEOUT
|
|
|
|
# 재시작 설정 (메모리 누수 방지)
|
|
max_requests = settings.GUNICORN_MAX_REQUESTS
|
|
max_requests_jitter = settings.GUNICORN_MAX_REQUESTS_JITTER
|
|
|
|
# 로깅 설정
|
|
accesslog = settings.GUNICORN_ACCESSLOG
|
|
errorlog = settings.GUNICORN_ERRORLOG
|
|
loglevel = settings.GUNICORN_LOGLEVEL
|
|
|
|
# 로그 포맷 통일 (logger_manager.py와 동일한 포맷)
|
|
# %(s)s: 상태코드, %(m)s: HTTP메서드, %(U)s: URL경로, %(q)s: 쿼리스트링
|
|
# %(h)s: 클라이언트IP, %({User-Agent}i)s: User-Agent
|
|
access_log_format = '%(s)s %(m)s %(U)s%(q)s - IP:%(h)s Agent:"%({User-Agent}i)s"'
|
|
|
|
# Gunicorn error/worker 로그 포맷 설정
|
|
logconfig_dict = {
|
|
'version': 1,
|
|
'disable_existing_loggers': False,
|
|
'formatters': {
|
|
'default': {
|
|
'format': '[%(asctime)s] [%(levelname)s] (gunicorn) %(message)s',
|
|
'datefmt': '%Y-%m-%d %H:%M:%S %z'
|
|
},
|
|
'access': {
|
|
'format': '[%(asctime)s] [%(levelname)s] (gunicorn.access) %(message)s',
|
|
'datefmt': '%Y-%m-%d %H:%M:%S %z'
|
|
},
|
|
},
|
|
'handlers': {
|
|
'console': {
|
|
'class': 'logging.StreamHandler',
|
|
'formatter': 'default',
|
|
'stream': 'ext://sys.stdout'
|
|
},
|
|
'access_console': {
|
|
'class': 'logging.StreamHandler',
|
|
'formatter': 'access',
|
|
'stream': 'ext://sys.stdout'
|
|
},
|
|
},
|
|
'root': {
|
|
'level': settings.GUNICORN_LOGLEVEL.upper(),
|
|
'handlers': ['console']
|
|
},
|
|
'loggers': {
|
|
'gunicorn.error': {
|
|
'level': settings.GUNICORN_LOGLEVEL.upper(),
|
|
'handlers': ['console'],
|
|
'propagate': False,
|
|
},
|
|
'gunicorn.access': {
|
|
'level': settings.GUNICORN_LOGLEVEL.upper(),
|
|
'handlers': ['access_console'],
|
|
'propagate': False,
|
|
},
|
|
}
|
|
}
|
|
|
|
# 프로세스 네임
|
|
proc_name = "nuriq_server"
|
|
|
|
# hook 함수
|
|
def on_starting(server):
|
|
"""
|
|
Gunicorn 마스터 프로세스가 시작될 때 한번만 실행
|
|
워커가 생성되기 전 실행, 전역 초기화 작업
|
|
"""
|
|
server.log.info("[Gunicorn] 마스터 프로세스 시작 중 ...")
|
|
|
|
# Flask 앱 컨텍스트 내에서 초기화 작업 수행
|
|
from app import create_app
|
|
app = create_app()
|
|
|
|
def post_worker_init(worker):
|
|
"""각 워커 프로세스 초기화된 후 사용"""
|
|
worker.log.info(f"Worker {worker.pid} 초기화 완료") |