Super Kawaii Cute Cat Kaoani
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ธํ”„๋ผ

[์ธํ”„๋ผ] Nginx ์‚ฌ์šฉํ•˜์—ฌ Blue/Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๋„์ž…

๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๋„์ž… ๋ฐฐ๊ฒฝ

 GitLab ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€๋Š”๋ฐ build ๋˜๊ณ  ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ๋˜๋Š”๋ฐ ์•ฝ 8์ดˆ ์ •๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋‹จ๋˜๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒ๋˜์—ˆ๋‹ค.

 

 ์ถ”ํ›„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋•Œ ๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๋‹จ๋˜๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์›๋“ค๊ณผ ์ƒ์˜ ํ›„ Nginx๋ฅผ ์„ค์น˜ํ•˜๊ณ  Blue/Green ๋ฐฐํฌ ๋ฐฉ์‹์œผ๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

 

 ๋˜, ๊ธฐ์กด์— GitLab ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ์™€ ํ”„๋กœ์ ํŠธ ๋‚ด์— Docker ํŒŒ์ผ์„ ๋‘๊ณ  ๋นŒ๋“œ๋ฅผ ํ•˜์˜€๋Š”๋ฐ, ์  ํ‚จ์Šค์™€ GitLab์„ ์—ฐ๋™ํ•˜์—ฌ ์  ํ‚จ์Šค๋กœ Build๋ฅผ ํ–ˆ๋‹ค. → Build ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์ง


Nginx ๋ž€?

 ์‹œ์žฅ์—์„œ ์ ์œ ์œจ์ด ๋†’์€ apache์™€ ๊ฐ™์€ ์›น์„œ๋ฒ„ ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค. ๋˜ apache ๋ณด๋‹ค ๋™์ž‘์ด ๋‹จ์ˆœํ•˜๊ณ  ์ „๋‹ฌ์ž ์—ญํ• ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์ ‘์†์— ํŠนํ™”๋˜์–ด ์žˆ๋‹ค.

 

 ์˜ˆ๋ฅผ ๋“ค์–ด ๋™์‹œ์ ‘์†์ž๊ฐ€ 700๋ช… ์ด์ƒ์ด๋ผ๋ฉด ์„œ๋ฒ„๋ฅผ ์ฆ์„คํ•˜๊ฑฐ๋‚˜, nginx ํ™˜๊ฒฝ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•  ์ •๋„๋กœ ์„ฑ๋Šฅ์ด ์ข‹๊ณ  ๋‹ค์ค‘์ ‘์†์— ํŠนํ™”๋˜์–ด์žˆ๋‹ค.

 

 

 nginx์˜ ๊ตฌ๋™ ๋ฐฉ์‹์€ Event Driven(๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฐฉ์‹)์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์–ด๋–ค ๋™์ž‘์„ ํ•ด์•ผํ•˜๋Š”์ง€๋งŒ ์•Œ๋ ค์ฃผ๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— CPU์™€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์ž…/์ถœ๋ ฅ๋“ค์„ ์ „๋ถ€ Event Listener๋กœ ์ „๋‹ฌํ•ด์„œ ํ๋ฆ„์ด ๋Š๊ธฐ์ง€ ์•Š๊ณ  ์‘๋‹ต์ด ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰๋˜์–ด 1๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณด๋‹ค ๋” ๋น ๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

Nginx ์—ญํ• 

HTTP ์„œ๋ฒ„ ์—ญํ• 

 ์›น์„œ๋ฒ„์˜ ์—ญํ• ์€ HTML, CSS, JavaScript, ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ์ •์ ์ธ ์ •๋ณด๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €(Chrome, Explore, Opera, FireFox ๋“ฑ)์— ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Reverse Proxy) ์—ญํ• 

 ์„œ๋ฒ„ ์•ž๋‹จ์— ์›น์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋กœ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์•ž์— ์žˆ๋Š” ์›น์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„(Nginx)๋Š” ์„œ๋ฒ„์˜ ํฌํŠธ๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ค€๋‹ค.

 

 ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ํ•˜๋Š” ์š”์ฒญ๊ณผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์นœ ์š”์ฒญ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘์ ์œผ๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋ณด์•ˆ์ƒ ์ด์ ์ด ์žˆ๊ณ , ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ๋ถ„๋ฐฐํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ„์‚ฐ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

EC2 ์„œ๋ฒ„์— Nginx ์„ค์น˜ ( ํ”„๋กœ์ ํŠธ ์„œ๋ฒ„ - Ubuntu Server 20.04 LTS )

1. apt ์—…๋ฐ์ดํŠธ

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

  • ํŒจํ‚ค์ง€ ์ธ๋ฑ์Šค ์ •๋ณด ์—…๋ฐ์ดํŠธ
sudo apt update
  • ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ
sudo apt upgrade

 

Ubuntu APT๋ž€?

- APT(Advanced Packaging Tool)
- ๋ฐ๋น„์•ˆ๊ณผ ์šฐ๋ถ„ํˆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฐ๋น„์•ˆ(debian) ๊ณ„์—ด ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ๋“ค์˜ ์ฃผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ
- apt ๊ด€๋ฆฌ ๋„๊ตฌ์ธ apt-get๊ณผ apt-cache์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ ํ†ตํ•ฉํ•˜์—ฌ ๋ณด๋‹ค ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๊ณ ์•ˆ๋œ ์ƒˆ apt ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ
- ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ

 

๐Ÿ“Œ apt ์‚ฌ์šฉ๋ฒ• ์ฐธ์กฐ ๋ธ”๋กœ๊ทธ
http://taewan.kim/tip/apt-apt-get/

 

Ubuntu ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ํˆด: apt ์‚ฌ์šฉ๋ฒ•

์šฐ๋ถ„ํˆฌ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ํˆด์ธ apt์™€ apt-get์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ  ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

taewan.kim

2. Nginx ์„ค์น˜

# apt install [ํŒจํ‚ค์ง€๋ช…] -> ํŒจํ‚ค์ง€ ์„ค์น˜
sudo apt install nginx

# apt remove nginx [ํŒจํ‚ค์ง€๋ช…] -> ํŒจํ‚ค์ง€ ์‚ญ์ œ
sudo apt remove nginx

3. Nginx ์‹œ์ž‘, ์ข…๋ฃŒ, ์žฌ์‹œ์ž‘, ์ƒํƒœ, ์‹คํ–‰ ํ…Œ์ŠคํŠธ

sudo service nginx start # nginx ์‹œ์ž‘
sudo service nginx stop # nginx ์ข…๋ฃŒ
sudo service nginx restart # nginx ์žฌ์‹œ์ž‘
sudo service nginx status # nginx ์ƒํƒœ
sudo nginx -t # ์‹คํ–‰ ํ…Œ์ŠคํŠธ
  • Nginx ์‹คํ–‰, ์ข…๋ฃŒ ํ™”๋ฉด

Spring Boot  + Nginx ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ž€?

 ์˜ˆ์ „์— ๋ฐฐํฌ๋ผ๊ณ  ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋ฒฝ ์‹œ๊ฐ„๋Œ€์— ๋‚จ์•„ ์„œ๋น„์Šค๋ฅผ ์ •์ง€ํ•˜๊ณ  ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์ด ๋•Œ, ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์•„์นจ๊นŒ์ง€ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์‹œ๊ฐ„์ด๋ผ๋ฉด ๊ธด๊ธ‰์ ๊ฒ€์„ ๊ฑธ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋กค๋ฐฑ์กฐ์ฐจ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ์˜ ๋ถ€๋‹ด์ด ๋งค์šฐ ์ปธ๋‹ค.

 

 ์œ„์ฒ˜๋Ÿผ ์„œ๋น„์Šค๋ฅผ ์ •์ง€ํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ์ด๋‹ค.

Blue / Green ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

  Rolling ๋ฐฐํฌ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฐํฌ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์™€ ์ž์›์„ ๋Š˜๋ฆฌ์ง€ ์•Š๊ณ , EC2 ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฝ๊ฒŒ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ Blue/Green ๋ฐฉ์‹์„ ์ฑ„ํƒ

 

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

 

์žฅ์ ?

  • ๊ตฌ๋ฒ„์ „์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์–ด์„œ ์†์‰ฌ์šด ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ตฌ๋ฒ„์ „์˜ ํ™˜๊ฒฝ์„ ๋‹ค์Œ ๋ฐฐํฌ์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์šด์˜ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ ๋ฒ„์ „ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ.

๋‹จ์ ?

  • ์‹œ์Šคํ…œ ์ž์›์ด ๋‘๋ฐฐ๋กœ ํ•„์š”ํ•˜๋‹ค. 
  • ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ œ๋˜์–ด์•ผ ํ•œ๋‹ค.

EC2๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฐํฌ ์ˆœ์„œ

  1. EC2(๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„)์— Nginx 1๋Œ€์™€ ์Šคํ”„๋ง๋ถ€ํŠธ jar 2๋Œ€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • Nginx : 80(http), 443(https) ํฌํŠธ ์‚ฌ์šฉ,
    • ์Šคํ”„๋ง๋ถ€ํŠธ1(9001), ์Šคํ”„๋ง๋ถ€ํŠธ2(9002)
  2. ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค ์ฃผ์†Œ๋กœ ์ ‘์†ํ•œ๋‹ค (80 ๋˜๋Š” 443 ํฌํŠธ)
  3. Nginx๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ์Šคํ”„๋ง๋ถ€ํŠธ๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค.
  4. ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด Nginx์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์Šคํ”„๋ง๋ถ€ํŠธ๋กœ ๋ฐฐํฌํ•œ๋‹ค.
  5. ๋ฐฐํฌ๊ฐ€ ๋๋‚˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ•œ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๊ตฌ๋™์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  6. 5์—์„œ ํ™•์ธํ•œ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์ •์ƒ ๊ตฌ๋™์ค‘์ด๋ฉด nginx reload๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ํฌํŠธ๋ฅผ nginx๊ฐ€ ์—ฐ๊ฒฐํ•˜๋„๋ก ํ•œ๋‹ค.
  7. ๋งŒ์•ฝ ๋ฐฐํฌ์‹œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ rollback์ด ํ•„์š”ํ•˜๋ฉด ngix๊ฐ€ ๋ฐฐํฌ์ „์— ์—ฐ๊ฒฐ๋˜์—ˆ๋˜ ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.
  8. ์‹ ๊ทœ ์ฝ”๋“œ ๋ฐฐํฌ๊ฐ€ ๋ฐœ์ƒ ๋  ๋•Œ ๋งˆ๋‹ค JAR ์‹คํ–‰ ํฌํŠธ๊ฐ€ 9001 → 9002 → 9001 → 9002 .. ์‹์œผ๋กœ ์Šค์œ„์นญ

๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Nginx ์„ค์ •

1. default ํŒŒ์ผ ์—ด๊ธฐ

sudo vim /etc/nginx/sites-enabled/default
include /etc/nginx/conf.d/service-url.inc;
proxy_pass $service_url;

์•„๋ž˜ ์œ„์น˜์— ์œ„ ๋‘์ค„์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

try-files $uri/ =404; #์ด ๋ถ€๋ถ„์€ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ธฐ

 

2. service-url.inc ํŒŒ์ผ ์—ด๊ธฐ

sudo vim /etc/nginx/conf.d/service-url.inc

์œ„ ํด๋”์— ์•„๋ž˜์˜ ์ฝ”๋“œ ์ถ”๊ฐ€

set $service_url http://127.0.0.1:9001;

nginx๊ฐ€ ์ž๋™์œผ๋กœ 9001 ํฌํŠธ์— ํฌ์›Œ๋”ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๊ธฐ๋ณธํฌํŠธ (80)์œผ๋กœ ์ ‘์†ํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ 9001 ํฌํŠธ์— ์—ฐ๊ฒฐ๋จ

 

3. nginx ์žฌ์‹œ์ž‘

sudo service nginx restart