""" 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} 초기화 완료")