Web programming

NGINX ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ • ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2024. 2. 27.

๊ฐœ์š”

์•ž์„  ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด Vercel ์— ๋ฐฐํฌ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ Vercel ํŽ˜์ด์ง€์—์„œ๋Š” HTTPS ํ†ต์‹ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์š”์ฒญ์„ ๋ณด์•ˆ ์ฒ˜๋ฆฌ ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, HTTPS ํ†ต์‹ ์œผ๋กœ API ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์— ์ง์ ‘ HTTPS ํ†ต์‹ ์— ๊ด€ํ•œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  SSL Termination ์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”„๋กœ๋”ฉ(Offloading)์€ ์‹œ์Šคํ…œ์˜ ํŠน์ • ์ž‘์—…์ด๋‚˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ, ์žฅ์น˜ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ ์ด์ „ํ•˜์—ฌ ๋ฉ”์ธ ์‹œ์Šคํ…œ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ๊ณตํ†ต๋œ ์•ž๋‹จ์˜ ํ•œ ๊ณณ์—์„œ SSL ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ  ๋ชจ๋‘ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. SSL Termination์€ SSL Offloading์˜ ํ•œ ํ˜•ํƒœ๋กœ, SSL/TLS ์—ฐ๊ฒฐ์ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋‚˜ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์™€ ๊ฐ™์€ ์ค‘๊ฐ„ ์žฅ์น˜์—์„œ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

์•ž์„  ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ SSL Termination ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/176

 

์„œ๋ฒ„์— HTTPS ์š”์ฒญ ๋ณด๋‚ด๊ธฐ 1ํŽธ - (feat. Mixed Content ์—๋Ÿฌ ํ•ด๊ฒฐ)

๊ฐœ์š”์ตœ์ข…์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ์ž‘์—…์ด ๋๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ธฐ ์œ„ํ•ด, Vercel์— ๋ฐฐํฌ๋œ ์›น ํŽ˜์ด์ง€์—์„œ  ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ EC2 ์ธ์Šคํ„ด์Šค API ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๋™ํ•˜์ž๋งˆ์ž ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ

programmer-may.tistory.com

(์ด์ „ ํ”„๋กœ์ ํŠธ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ํฌ์ŠคํŒ… -  ALB ๋ฅผ ์ด์šฉํ•˜์—ฌ Mixed Contents ์—๋Ÿฌ ํ•ด๊ฒฐ)

 

ALB๋ฅผ ํ™œ์šฉํ•˜๋ฉด, AWS ๋ชจ๋“ˆ์„ ํ•˜๋‚˜ ๋” ์‚ฌ์šฉํ•˜๋ฏ€๋กœ์จ ๋น„์šฉ์ด ๊ณผ๋‹ค ์ฒญ๊ตฌ๋  ์ˆ˜์žˆ๊ธฐ์—, ๋น„์šฉ ์ ˆ๊ฐ ์ธก๋ฉด์—์„œ ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋ฐฉ์‹์œผ๋กœ SSL Termination ์ฒ˜๋ฆฌํ•  ๊ฒƒ์„ ํŒ€์— ์˜๊ฒฌ ์–ดํ•„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒ€ ๋‚ด์—์„  ์ธํ”„๋ผ ๋‹ด๋‹น์ด ์ € ํ˜ผ์ž์ด๋‹ˆ ์ €์˜ ์˜๊ฒฌ์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•˜์˜€๊ณ , ๋น„์šฉ๋„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

ALB๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜คํ”ˆ์†Œ์Šค ์›น์„œ๋ฒ„๋ฅผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ํ™œ์šฉ : ์•„ํŒŒ์น˜ ํ˜น์€ NGINX ๋ฅผ ๊ตฌ๋™์‹œ์ผœ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด  ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์š”์ฒญ์ด ์˜ค๋ฉด ๋จผ์ € ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์—๋Š” Let's Encrypt ๊ฐ™์€TLS/SSL ์ธ์ฆ์„œ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” CA(์ธ์ฆ ๊ธฐ๊ด€)์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ์„œ๋ฅผ ์„ค์ •ํ•˜์—ฌ SSL Termination์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ HTTP ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด HTTPS ์š”์ฒญ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ค๊ณ , HTTPS ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด SSL Termination ํ•œ ํ›„ ํ‰๋ฌธ ์š”์ฒญ์„ Path ๋งž๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ํฌ์›Œ๋”ฉ ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Apache HTTP Server  VS NGINX

์„œ์นญ ๊ฒฐ๊ณผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋‚˜ ์›น์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„๋ฆฌ ์“ฐ์ด๋Š” ์˜คํ”ˆ ์†Œ์Šค๋Š” ํฌ๊ฒŒ ์•„ํŒŒ์น˜ HTTP ์„œ๋ฒ„์™€ ์—”์ง„์—‘์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘˜ ์ค‘์— ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ์†Œ์Šค ์„œ๋ฒ„์™€ ์ปค๋„ฅ์…˜์„ ๋งบ์–ด SSL Termination ํ•˜๊ณ  ์š”์ฒญ์„ ๋ผ์šฐํŒ… ํ•  ์ •๋„์˜ ๋ชฉ์ ์„ฑ๊ณผ, ๊ฐ€๋ฒผ์šด ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ์— ์—”์ง„์—‘์Šค๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์™œ ์—”์ง„์—‘์Šค๊ฐ€ ์•„ํŒŒ์น˜ ์„œ๋ฒ„๋ณด๋‹ค ๊ฐ€๋ณ๋‹ค๊ณ  ํ• ๊นŒ์š”?

 

Apache HTTP Server

์•„์ฐจํ”ผ ์„œ๋ฒ„๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ , ์ƒˆ ์ปค๋„ฅ์…˜์ด ์ƒ๊ธธ ๋•Œ๋งˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ• ๋‹นํ•˜๋Š” PREFORK ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1. ์ปค๋„ฅ์…˜ ์ˆ˜๋ฆฝ์‹œ keep-alive ํ—ค๋”๋กœ ์ง€์† ์—ฐ๊ฒฐ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ  ๊ฒฐ๊ตญ C10K ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

2. ์š”์ฒญ ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ํ• ๋‹นํ•ด์„œ CPU๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ์š”์ฒญ์„ ํ•ด๊ฒฐํ•˜๋ฉด ์ž์ฃผ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์€ ๋†’์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

3. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์„ ์ง€์›ํ•ด์ฃผ์ง€๋งŒ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌด๊ฑฐ์›Œ์ง‘๋‹ˆ๋‹ค.

 

NGINX 

NGINX๋Š” ์•„ํŒŒ์น˜ ์„œ๋ฒ„๋ฅผ ๋Œ€์ฒดํ•˜๋ ค๊ณ  ๋‚˜์˜จ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ปค๋„ฅ์…˜์„ ์œ ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ์—”์ง„์—‘์Šค์˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋•๋ถ„์ž…๋‹ˆ๋‹ค. 

1. ์ปค๋„ฅ์…˜ ํ˜•์„ฑ, ์ปค๋„ฅ์…˜ ์ œ๊ฑฐ ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฒคํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋ฒคํŠธ๋Š” ํ์— ๋‹ด๊ธด ์ƒํƒœ์—์„œ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋Œ€๊ธฐํ•˜๊ณ  ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

2. ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋Š” ๋ณดํ†ต CPU์˜ ์ฝ”์–ด ์ˆ˜ ๋งŒํผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋Œ€ํญ ์ค„์–ด CPU์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

  ์•„ํŒŒ์น˜ ์„œ๋ฒ„ ์—”์ง„์—‘์Šค
์•„ํ‚คํ…์ฒ˜ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ
์•ˆ์ •์„ฑ ๋†’๋‹ค(๊ฐ ์š”์ฒญ์€ ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์•ˆ์ •์„ฑ์ด ๋†’๋‹ค. ) ๋น„๊ต์  ๋‚ฎ๋‹ค(ํ•œ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ์š”์ฒญ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋ฉด ๋‹ค๋ฅธ ์š”์ฒญ์—๋„ ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค.)
์„ฑ๋Šฅ ๋งŽ์€ ๋™์‹œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ผ์–ด๋‚˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.  ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ๋•๋ถ„์— ๋งŽ์€ ๋™์‹œ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ตฌ์กฐ๋ผ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.  ์ ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๋‹ค.
ํ™•์žฅ์„ฑ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ• ์ˆ˜ ์žˆ์–ด์„œ ํ™•์žฅ์„ฑ์— ์šฉ์ดํ•˜๋‹ค. ์—”์ง์—‘์Šค์— ๋น„ํ•ด ์ œ๊ณต๋˜๋Š” ๋ชจ๋“ˆ์ด ๋งŽ๋‹ค. ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“ˆ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.(์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋‹ด๋‹นํ•˜๊ธฐ์— ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์›Œ์ปคํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜์–ด ์ง์ ‘ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ธฐ ๊นŒ๋‹ค๋กญ๋‹ค.) 
์„ค์ • Apache์˜ ์„ค์ • ํŒŒ์ผ(httpd.conf ๋“ฑ)์€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์„ค์ •์„ ์œ„ํ•ด ์ž์„ธํ•œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. Nginx์˜ ์„ค์ • ํŒŒ์ผ(nginx.conf ๋“ฑ)์€ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๋‹ค.
์šฉ๋„ ๋™์  ์ปจํ…์ธ  ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค(Apache๋Š” PHP, Python, Perl ๋“ฑ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.)
๋ชจ๋“ˆ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์„ค์ • ๋ฐ ๊ธฐ๋Šฅ์— ์“ฐ์ธ๋‹ค.
์ฃผ๋กœ ์ •์  ์ปจํ…์ธ  ์ฒ˜๋ฆฌ(Nginx๋Š” ์ •์  ์ฝ˜ํ…์ธ (์ด๋ฏธ์ง€, CSS, JavaScript ๋“ฑ)๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.)
๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ: Nginx๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค.(๋™์  ์„ค์ • ๋ณ€๊ฒฝ)

 

์ž์„ธํ•œ ๋น„๊ต ๋‚ด์šฉ์€ ๋”ฐ๋กœ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…ํ–ˆ๊ธฐ์— ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/200

 

์•„ํŒŒ์น˜ vs ์—”์ง„์—‘์Šค

๊ฐœ์š”๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ๋„๋ฆฌ ์“ฐ์ด๋Š” ์›น์„œ๋ฒ„๋กœ Apache HTTP Server, Nginx ๊ฐ€ ๋„๋ฆฌ ์“ฐ์ด์ง€๋งŒ, ํ˜„๋Œ€์— ์™€์„œ๋Š” Nginx ์˜ ์‹œ์žฅ ์ ์œ ์œจ์ด Apache HTTP Server ๋ฅผ ๋›ฐ์–ด ๋„˜์–ด์„œ ์‹œ์žฅ ์ ์œ ์œจ์ด ๋” ๋†’์€ Ng

programmer-may.tistory.com

 

๊ฒฐ๋ก 

์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ๋ชจ๋“ˆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ์š”์ฒญ์˜ SSL Termination ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ฏ€๋กœ ๊ฐ€๋ณ๊ณ , ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ NGINX๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ (Reverse Proxy Server)๋ฅผ ๊ตฌ์ถ• ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์ถ• ๊ณผ์ •์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ… ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/196

 

SSL Termination ์„ ์œ„ํ•ด NginX ๋กœ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ

๊ฐœ์š”์•ž์„  ํ”„๋กœ์ ํŠธ์—์„œ Active Mixed Content ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— HTTPS ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด SSL Termination ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , SSL Termination ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

programmer-may.tistory.com

 

NGINX๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •์„ ํ•˜๋ฉด์„œ ๊ฒช์€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฒฝํ—˜์„ ์ด์ œ๋ถ€ํ„ฐ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 1

๋ฌธ์ œ ์ƒํ™ฉ

ํ…Œ์ŠคํŠธ EC2 ์„œ๋ฒ„์˜ 8081 ํฌํŠธ์— ์Šคํ”„๋ง ๋ถ€ํŠธ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜์˜€๋Š”๋ฐ, ์š”์ฒญ์ด ์„œ๋ฒ„๊นŒ์ง€ ๋‹ฟ์งˆ ์•Š๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

sudo ufw allow 8081

๋ฐฉํ™”๋ฒฝ ๋ฌธ์ œ์ธ์ค„ ์•Œ๊ณ , 8081 ํฌํŠธ์— ๋Œ€ํ•œ ๋ฐฉํ™”๋ฒฝ๋„ ์—ด์–ด๋ณด๊ณ  ๋ฐฉํ™”๋ฒฝ์„ disable ํ–ˆ์ง€๋งŒ, ์ž‘๋™ํ•˜์งˆ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

์ž‘์—…

nginx -t

๋ช…๋ น์–ด๋ฅผ ์ณ์„œ EC2 ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ Nginx ์›น ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์›์ธ

nginx: [warn] conflicting server name "api.yanabada.com" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

Nginx ์„ค์ • ํŒŒ์ผ(/etc/nginx/nginx.conf)์˜ ๊ตฌ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅด๊ณ , Nginx ์„ค์ • ํŒŒ์ผ์˜ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ ๋งจ์œ„์— 80ํฌํŠธ์— ๋Œ€ํ•œ ์„œ๋ฒ„ ๋„ค์ž„์ด ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๊ณ  ์žˆ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•ด๊ฒฐ

server {
    listen 80;
    server_name api.yanabada.com;
    return 301 https://$server_name$request_uri;
}

server {
    index index.html index.htm index.nginx-debian.html;
    server_name api.yanabada.com;

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.yanabada.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.yanabada.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /ws-stomp {
        proxy_pass http://127.0.0.1:8081/ws-stomp;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    if ($host = api.yanabada.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    server_name api.yanabada.com;
    return 404; # managed by Certbot
}

 

๋งจ ์œ„์™€ ๋งจ ์•„๋ž˜์— listen 80 ์— ๋Œ€ํ•˜์—ฌ ๊ฐ™์€ ์„œ๋ฒ„ ๋„ค์ž„์„ ๊ฐ–๋Š” ์„œ๋ฒ„ ๋ธ”๋ก์ด ์žˆ์–ด์„œ ์ด๊ฒƒ์ด ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Nginx๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ, ํŠน์ • ์„œ๋ฒ„ ๋ธ”๋ก๊ณผ ์—ฐ๊ด€๋œ ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์„œ๋ฒ„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๋ธ”๋ก์ด ์กด์žฌํ•˜๋ฉด, ์–ด๋А ์„œ๋ฒ„ ๋ธ”๋ก์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ 80ํฌํŠธ์— ๋Œ€ํ•œ ์„œ๋ฒ„๋ธ”๋ก์„ ํ•˜๋‚˜ ์ง€์›Œ์ค˜์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

server {
    listen 80;
    server_name api.yanabada.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl ipv6only=on;
    server_name api.yanabada.com;

    ssl_certificate /etc/letsencrypt/live/api.yanabada.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.yanabada.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /ws-stomp {
        proxy_pass http://127.0.0.1:8081/ws-stomp;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

 

๊ฒฐ๊ณผ

์„œ๋ฒ„ ๋ธ”๋ก ์ถฉ๋Œ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ์ง€๋งŒ, ์•„์ง๋„ ์š”์ฒญ์ด ์Šคํ”„๋ง ์„œ๋ฒ„์— ์˜ค๊ณ  ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 2

์•ž์„œ์„œ CORS ๋ฅผ ๊ณต๋ถ€ํ•˜์˜€์„ ๋•Œ CORS ๋™์ž‘ ๋ฐฉ์‹ ์ค‘ ์ธ์ฆ๋œ ์š”์ฒญ (Credentialed Request) ๋ฐฉ์‹์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. JWT๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค๋กœ ์ž๊ฒฉ ์ธ์ฆ์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญ ํ—ค๋”์˜ Authorization ํ•„๋“œ์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Authorization ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœ ์š”์ฒญ(simple request)์ด ์•„๋‹ˆ๋ฉฐ ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/184

 

Network - CORS ์—๋Ÿฌ ๊ฐœ๋…๊ณผ ํ•ด๊ฒฐ๋ฒ• (Spring MVC, Spring Security)

์—ด์‹ฌํžˆ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ EC2์— ๋„์›Œ ์„œ๋ฒ„๋ฅผ ํ™œ์„ฑํ™” ์‹œํ‚ค๊ณ  ํ”„๋ก ํŠธ ์—”๋“œ์˜ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ ค ํ–ˆ๋Š”๋ฐ, ๋ ์šฉ?! ํŽ˜์ด์ง€์— ๋ฐ์ดํ„ฐ๋Š” ๋ณด์ด์ง€ ์•Š๊ณ , ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ผœ๋ฉด ๋นจ๊ฐ„ ์—๋Ÿฌ๋“ค๋งŒ ๊ฐ€๋“ํ–ˆ

programmer-may.tistory.com

 

ํ•ด๊ฒฐ

๋”ฐ๋ผ์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Authorization ํ—ค๋”๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด๋Š” ์—”์ง„์—‘์Šค ์„ค์ •ํŒŒ์ผ์—์„œ๋„ ํ—ค๋”๋ฅผ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ ๋™์ž‘ํ•˜๋Š” Nginx๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์‚ฌ์ด์— ์œ„์น˜ํ•˜์—ฌ ์š”์ฒญ์„ ์ค‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Nginx๋Š” ํ”„๋ก์‹œ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ๋•Œ, HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š” ์—†๋Š” ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋”๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, Nginx๊ฐ€ ์ด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization $http_authorization; #Authorization ํ—ค๋” ์ถ”๊ฐ€

 

๊ฒฐ๊ณผ

ํ—ค๋”๋ฅผ ๋ช…์‹œํ•˜๊ณ  ๋‚˜์„ , ๋“œ๋””์–ด ์Šคํ”„๋ง ๋ถ€ํ„ฐ ์„œ๋ฒ„์™€ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, WSS ์‚ฌ์šฉํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์€ ์ž‘๋™๋˜๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฑธ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 3

WSS ์‚ฌ์šฉํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์€ ์ž‘๋™๋˜์ง€ ์•Š์€ ๊ฒƒ๋„ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 2์™€ ๊ฐ™์€ ์ด์œ ์˜€์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ํ•„์š”ํ•œ ํ—ค๋”๊ฐ€ ๋ˆ„๋ฝ๋๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•ž์„œ์„œ ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ์„ ๊ณต๋ถ€ํ–ˆ์„ ๋•Œ, ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„  HTTP/HTTPS ์š”์ฒญ์„ ํ†ตํ•ด ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์ด ์š”์ฒญ์€ Upgrade ํ—ค๋”๋ฅผ ํฌํ•จํ•˜์—ฌ ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ๋กœ์˜ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

https://programmer-may.tistory.com/191

 

๊ธฐ์—… ์—ฐ๊ณ„ ํ”„๋กœ์ ํŠธ - ์ฑ„ํŒ…๋„๋ฉ”์ธ : ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…

๊ฐœ์š”์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€๋ฐฉ๊ณผ ํ•จ๊ป˜ ๊ฒจ๋ฃจ๋Š” ๊ฒŒ์ž„์ด๋‚˜, ์ฃผ์‹์ด๋‚˜ ๊ฒฝ๋งค ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ๊ทธ์ค‘์— ์šฐ๋ฆฌ์—๊ฒŒ ์นœ์ˆ™ํ•œ ์„œ๋น„์Šค๋กœ

programmer-may.tistory.com

 

Upgrade ํ—ค๋”: ์ด ํ—ค๋”๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์—ฐ๊ฒฐ์„ WebSocket์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. Connection ํ—ค๋”: ์ด ํ—ค๋”๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ์š”์ฒญ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Upgrade: websocket
Connection: Upgrade

 

ํ•ด๊ฒฐ

location /ws-stomp {
        proxy_pass http://127.0.0.1:8081/ws-stomp;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; #Upgrade ํ—ค๋” ์ถ”๊ฐ€
        proxy_set_header Connection "Upgrade"; #Connection ํ—ค๋” ์ถ”๊ฐ€
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

 

๋”ฐ๋ผ์„œ Upgrade ํ—ค๋”์™€ Connection ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ proxy_buffering off; ์„ค์ •์„ ํ•˜์—ฌ Nginx๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ ๋ฒ„ํผ๋งํ•˜์ง€ ์•Š๊ณ , ๊ณง๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

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

proxy_buffering off; ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด Nginx๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ ๋ฒ„ํผ๋งํ•˜์ง€ ์•Š๊ณ , ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, WebSocket ์—ฐ๊ฒฐ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ”ผ๋“œ, ์„œ๋ฒ„ ์„ผํŠธ ์ด๋ฒคํŠธ(Server-Sent Events) ๋“ฑ์—์„œ๋Š” ๋ฒ„ํผ๋ง์„ ๋„๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฐ๊ณผ

๋‹จ์ˆœ API ์š”์ฒญ ๋ฟ์•„๋‹ˆ๋ผ ์ด์   ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…๊นŒ์ง€ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์—”์ง„์—‘์Šค ์„ค์ •ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ํŠธ๋Ÿฌ๋ธ”์— ๋Œ€ํ•ด์„œ ํ•ด๊ฒฐ์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์•„ํŒŒ์น˜ ์„œ๋ฒ„์™€ ์—”์ง„์—‘์Šค๋ฅผ ๋น„๊ต ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ‰์†Œ CS๋ฅผ ๋ฐฐ์›Œ์•ผํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ตฌ๋‚˜ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™œ์šฉํ•œ ์„ค๊ณ„์™€ ๊ธฐ๋Šฅ ์ œ๊ณต๋ฉด์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— OS ๋ฅผ ๊ณต๋ถ€ํ–ˆ๋˜ ๊ฒƒ์ด ๋งŽ์ด ๋„์›€์ด ๋์Šต๋‹ˆ๋‹ค. ์™œ ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ์ด ๋†’์€์ง€, ์™œ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋Š” ๋งŽ์€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๋Š”์ง€, CPU ๋ณ‘๋ ฌ์„ฑ ๋“ฑ ํ‰์†Œ ๋ฐฐ์šด ๋‚ด์šฉ๋“ค์„ ์ ‘๋ชฉ์‹œํ‚ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฟŒ๋“ฏํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ Nginx ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, Nginx์˜ ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ต์…˜๊ณผ ๊ทธ ์—ญํ• ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Authorization  ํ—ค๋”์™€  WebSocket ๊ฐ™์€ ํŠน์ˆ˜ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ํ—ค๋” ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋А๋‚€ ์ ์€ Nginx ์„ค์ •์˜ ์ž‘์€ ์˜ค๋ฅ˜๋‚˜ ๋ˆ„๋ฝ๋œ ์„ค์ •์ด ํฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๋™์ผํ•œ ์„œ๋ฒ„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์„œ๋ฒ„ ๋ธ”๋ก์ด ์ค‘๋ณต๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ ๋ฌธ์ œ๋‚˜, ํŠน์ • ํ—ค๋”๊ฐ€ ์ œ๋Œ€๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” API ์š”์ฒญ ๋ˆ„๋ฝ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์กฑํ•œ ๋ถ€๋ถ„์œผ๋กœ๋Š”, ๋ณต์žกํ•œ ์„ค์ • ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ์ฒด๊ณ„์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‹ค์‹œ๊ฐ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋กœ๊ทธ ํŒŒ์ผ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€