From 4b52623f07da88b3ad82835cf6ba8ca8fabe5f99 Mon Sep 17 00:00:00 2001 From: cherry2250 Date: Thu, 30 Oct 2025 14:46:37 +0900 Subject: [PATCH] =?UTF-8?q?API=20=ED=83=80=EC=9E=84=EC=95=84=EC=9B=83?= =?UTF-8?q?=EC=9D=84=203=EB=B6=84=EC=9C=BC=EB=A1=9C=20=EC=A6=9D=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Next.js API Route fetch 타임아웃: 60초 → 180초 - Nginx 프록시 타임아웃: 60초 → 180초 - 이미지 생성 API의 504 Gateway Timeout 해결 - AbortController를 사용한 타임아웃 제어 추가 --- deployment/container/nginx.conf | 8 ++--- src/app/api/content/images/generate/route.ts | 38 ++++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/deployment/container/nginx.conf b/deployment/container/nginx.conf index 382db3f..500b3c3 100644 --- a/deployment/container/nginx.conf +++ b/deployment/container/nginx.conf @@ -55,10 +55,10 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # Timeouts - proxy_connect_timeout 60s; - proxy_send_timeout 60s; - proxy_read_timeout 60s; + # Timeouts - 이미지 생성은 시간이 오래 걸리므로 3분으로 설정 + proxy_connect_timeout 180s; + proxy_send_timeout 180s; + proxy_read_timeout 180s; } # Static files diff --git a/src/app/api/content/images/generate/route.ts b/src/app/api/content/images/generate/route.ts index ee9400c..9d2006d 100644 --- a/src/app/api/content/images/generate/route.ts +++ b/src/app/api/content/images/generate/route.ts @@ -11,13 +11,20 @@ export async function POST(request: NextRequest) { body, }); - const response = await fetch(`${CONTENT_API_BASE_URL}/api/v1/content/images/generate`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(body), - }); + // 이미지 생성은 시간이 오래 걸리므로 타임아웃을 3분으로 설정 + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 180000); // 3분 + + try { + const response = await fetch(`${CONTENT_API_BASE_URL}/api/v1/content/images/generate`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + signal: controller.signal, + }); + clearTimeout(timeoutId); if (!response.ok) { const errorText = await response.text(); @@ -28,10 +35,21 @@ export async function POST(request: NextRequest) { ); } - const data = await response.json(); - console.log('✅ Image generation job created:', data); + const data = await response.json(); + console.log('✅ Image generation job created:', data); - return NextResponse.json(data); + return NextResponse.json(data); + } catch (fetchError) { + clearTimeout(timeoutId); + if (fetchError instanceof Error && fetchError.name === 'AbortError') { + console.error('❌ Request timeout after 3 minutes'); + return NextResponse.json( + { error: 'Request timeout', details: 'Image generation request timed out after 3 minutes' }, + { status: 504 } + ); + } + throw fetchError; + } } catch (error) { console.error('❌ Proxy error:', error); return NextResponse.json(