504 Gateway TimeOut์ ํธ์ถ๋ ๋ก์ง์?
๊ฐ์
์ต๊ทผ ์์ ์ ํ๋ฉด์ 504 Gateway TimeOut์ด ๋ฐ์ํ๊ณ , ์ด์ ๋ฐ๋ผ ์ฒ์์๋ ์๋ฒ ๋ก์ง์ด ์ค๋จ๋์์ ๊ฒ์ด๋ผ ์๊ฐํ์ผ๋ ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์๋ค. ์ด์ฐ ๋ณด๋ฉด 504๋ ์๋ฒ(์์ธํ๋ WAS)์์ ๋ฑ์ ์ค๋ฅ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๋ง์ด์ง๋ง ๋ฌด์ฌ์ฝ 5xx ์๋ฌ๋ผ ์์ฒญ๋ ์๋ฒ ๋ก์ง๋ ์ค๋จ๋ ์ค ์์๋ค. ๊ทธ๋์ 504 Gateway TimeOut์ ๋ํด ๋ค์ ์์๋ณผ ๊ฒธ ์ ๋ฆฌํ๊ฒ ๋์๋ค.
๊ฒ์ดํธ์จ์ด๋ ๋ฌด์์ธ๊ฐ?
๊ฒ์ดํธ์จ์ด๋ ํต์ ๋ถ์ผ์์ ์๋ก ๋ค๋ฅธ ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐ์ ํ๋ ์ค๊ฐ์ ์ญํ ์ ํ๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ํต์ ํ๋กํ ์ฝ์ด๋ ๋ฐ์ดํฐ ํ์์ ๊ฐ์ง ๋คํธ์ํฌ ๊ฐ์ ์ํต์ด ๊ฐ๋ฅํด์ง๋ค.
์๋๋ Nginx๋ฅผ ์ฌ์ฉํ Gateway ๊ตฌ์ฑ์ ๋ํ ์ค๋ช ์ด๋ค. Nginx๋ ์น ์๋ฒ๋ก ๋๋ฆฌ ์๋ ค์ ธ ์์ง๋ง, ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋๋ ๊ฒ์ดํธ์จ์ด๋ก๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์๋ณธ ์๋ฒ๋ก ์ ๋ฌํ๊ณ , ์๋ณธ ์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ค์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.(Nginx ์์๋ฅผ ๊ฐ์ ธ์จ ์ด์ ๋ ๋๋ถ๋ถ์ด ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก Nginx๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.)
์ผ๋ฐ์ ์ผ๋ก '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์ด ์ฌ์ด์์ ์ํ๋ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์๋ค.