๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Etc

504 Gateway TimeOut์‹œ ํ˜ธ์ถœ๋œ ๋กœ์ง์€?

by ์•ˆ์ฃผํ˜• 2023. 10. 26.

๊ฐœ์š”

์ตœ๊ทผ ์ž‘์—…์„ ํ•˜๋ฉด์„œ 504 Gateway TimeOut์ด ๋ฐœ์ƒํ–ˆ๊ณ , ์ด์— ๋”ฐ๋ผ ์ฒ˜์Œ์—๋Š” ์„œ๋ฒ„ ๋กœ์ง์ด ์ค‘๋‹จ๋˜์—ˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์œผ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค. ์–ด์ฐŒ ๋ณด๋ฉด 504๋Š” ์„œ๋ฒ„(์ž์„ธํžˆ๋Š” WAS)์—์„œ ๋ฑ‰์€ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ ๋ฌด์‹ฌ์ฝ” 5xx ์—๋Ÿฌ๋ผ ์š”์ฒญ๋œ ์„œ๋ฒ„ ๋กœ์ง๋„ ์ค‘๋‹จ๋  ์ค„ ์•Œ์•˜๋‹ค. ๊ทธ๋ž˜์„œ 504 Gateway TimeOut์— ๋Œ€ํ•ด ๋‹ค์‹œ ์•Œ์•„๋ณผ ๊ฒธ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ 504 ์˜ค๋ฅ˜ ํ™”๋ฉด
Postman์—์„œ์˜ 504 ์˜ค๋ฅ˜ ํ™”๋ฉด

 
 
 

๊ฒŒ์ดํŠธ์›จ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๊ฒŒ์ดํŠธ์›จ์ด๋Š” ํ†ต์‹  ๋ถ„์•ผ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐ์„ ํ•˜๋Š” ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‚˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๊ฐ€์ง„ ๋„คํŠธ์›Œํฌ ๊ฐ„์˜ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์•„๋ž˜๋Š” Nginx๋ฅผ ์‚ฌ์šฉํ•œ Gateway ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค. Nginx๋Š” ์›น ์„œ๋ฒ„๋กœ ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋˜๋Š” ๊ฒŒ์ดํŠธ์›จ์ด๋กœ๋„ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์›๋ณธ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , ์›๋ณธ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.(Nginx ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ ธ์˜จ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์ด ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ Nginx๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

Nginx๋ฅผ ์‚ฌ์šฉํ•œ Gateway ๊ตฌ์„ฑ๋„

์ผ๋ฐ˜์ ์œผ๋กœ 'upstream'์€ ์›๋ณธ ์„œ๋ฒ„, ์ฆ‰ WAS(Web Application Server)๋ฅผ ์ง€์นญํ•œ๋‹ค. ์œ„ ์ด๋ฏธ์ง€์—์„œ Nginx๋Š” 'downstream'์œผ๋กœ ๋ถ„๋ฅ˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•œ๋‹ค.

504 Gateway Time-out ์˜ค๋ฅ˜๋Š” ์ด ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์™€ ์›๋ณธ ์„œ๋ฒ„(upstream) ๊ฐ„์˜ ํ†ต์‹  ์‹œ๊ฐ„์ด ์ง€์ •๋œ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. 
 
 

504 ์˜ค๋ฅ˜์˜ ์ฃผ์š” ์›์ธ

  • connetct_timeout(default: 60s)
    • ์ฃผ๋กœ upstream ์—ฐ๊ฒฐ ์ง€์—ฐ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ upstream์€ ๊ฐ€๊นŒ์šด ์œ„์น˜์— ์žˆ์–ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋‚˜, ๋ฐฉํ™”๋ฒฝ์— ์˜ํ•ด proxy ์—ฐ๊ฒฐ์ด ์ฐจ๋‹จ๋  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฐ๊ฒฐ์€ TCP/IP์˜ 3-way handshake๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— SYN+ACK ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • send_timeout(default: 60s)
    • ๋ฐ์ดํ„ฐ ์ „์†ก ์ง€์—ฐ ์‹œ ๋ฐœ์ƒํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์—…๋กœ๋“œ ์ค‘ ์†๋„ ์ €ํ•˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • read_timeout(default: 60s)
    • upstream์—์„œ์˜ ์‘๋‹ต์ด ์ง€์—ฐ๋˜๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ์‘๋‹ต์ด ์ง€์—ฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค.
    • ์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ 504 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋”๋ผ๋„ ์š”์ฒญ์€ ์ด๋ฏธ ์ „์†ก๋œ ์ƒํƒœ์ด๋ฏ€๋กœ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์–ด๋„ upstream ์ž‘์—…์€ ๊ณ„์† ์ˆ˜ํ–‰๋œ๋‹ค.
public class BackendProcess {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            try {
                System.out.println("Processing: " + i);
                Thread.sleep(1000);  // 1์ดˆ ๋Œ€๊ธฐ
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Processing completed.");
    }
}

์œ„ ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต๋งˆ๋‹ค 1์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋ฉฐ, 10๋ฒˆ ๋ฐ˜๋ณต๋ฌธ์ด ์ˆ˜ํ–‰๋˜๊ณ , ์ด๋ก ์ƒ ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ „์ฒด ์ž‘์—… ์‹œ๊ฐ„์ด 10์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ์ด๋‹ค. ๋งŒ์•ฝ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์˜ read_timeout ์„ค์ •์ด 5์ดˆ๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, 5์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ๋Š” 504 Gateway Timeout ์˜ค๋ฅ˜๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉฐ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ์ง€๋งŒ, ๋ฐฑ์—”๋“œ ์ž‘์—…์€ ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ๊ณ„์†ํ•ด์„œ ์ง„ํ–‰๋˜๋ฉฐ 10๋ฒˆ์˜ "Processing" ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ "Processing completed." ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
 
 

์•Œ์•„๋‘๋ฉด ์ข‹์€ ๋‚ด์šฉ

์„œ๋น„์Šค ์•ž๋‹จ์— AWS ELB๋‚˜ CloudFlare์™€ ๊ฐ™์€ ์„œ๋น„์Šค๊ฐ€ ์œ„์น˜ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

  • CloudFlare
    • Connection_timeout์€ 15์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด Error 522: connection timed out์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • read_timeout์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 100์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋‚˜, Enterprise Plan์—์„œ๋Š” ์ตœ๋Œ€ 600์ดˆ๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • AWS ELB(Elastic Load Balancer)
    • AWS ELB์—์„œ๋Š” send_timeout๊ณผ read_timeout์ด ๊ธฐ๋ณธ์ ์œผ๋กœ 60์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•œ๋‹ค๋ฉด 1~3600์ดˆ ์‚ฌ์ด์—์„œ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://aws.amazon.com/ko/blogs/aws/elb-idle-timeout-control/
https://aws.amazon.com/ko/blogs/aws/elb-idle-timeout-control/

๋Œ“๊ธ€