Study/Web, Server

Nginx

๋ณ˜์ฐŒ 2025. 3. 24. 14:45

๐Ÿ’ฌ Nginx๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์—, ๋จผ์ € ์›น ์„œ๋ฒ„๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

๐Ÿ’ก์›น ์„œ๋ฒ„(Web server)

  • ์›น ํŽ˜์ด์ง€์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ํ•˜๋“œ์›จ์–ด
    (์—ฌ๊ธฐ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €)
  • ์ •์  ์ฝ˜ํ…์ธ (HTML, CSS, JavaScript, ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ œ๊ณต
  • ๋Œ€ํ‘œ์ ์ธ ์›น ์„œ๋ฒ„๋กœ๋Š” Apache HTTP Server, Nginx ๋“ฑ์ด ์žˆ์Œ
  • ์ด๋•Œ ์›น ์„œ๋ฒ„๋Š” ์ •์ ์ธ ํŽ˜์ด์ง€๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๊ณ  ์ด์— WAS๊ฐ€ ๋“ฑ์žฅ
๋”๋ณด๊ธฐ

WAS(Web Application Server)

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

 

๐Ÿ’ก Apache vs Nginx

  • Apache
    • 1995๋…„์— ์ถœ์‹œ๋œ ๊ฐ€์žฅ ์˜ค๋ž˜๋˜๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์›น ์„œ๋ฒ„
    • ํ”„๋กœ์„ธ์Šค/์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒ
    • ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” MPM์„ ํ†ตํ•ด ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณต
      ๋”๋ณด๊ธฐ
      MPM(Multi-Processing Module)

      : ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ์–ด๋–ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ชจ๋“ˆ

      • prefork
        • ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
        • ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ž์›์€ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์š”์ฒญ์— ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค.
        • ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งŽ์•„์ง„๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
      • worker
        • ํ•˜๋‚˜์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ ์š”์ฒญ์€ ๊ฐ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ
        • ์ œํ•œ๋œ ์“ฐ๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์ƒˆ๋กœ์šด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ฒ˜๋ฆฌ
        • prefork์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ˆ์•ฝ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์“ฐ๋ ˆ๋“œ๋ผ๋ฆฌ ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์œผ๋ฉด ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค๋„ ๊ฐ™์ด ์ฃฝ์„ ์ˆ˜ ์žˆ์Œ
      • event
        • Nginx์˜ ์„ฑ๊ณต ์ดํ›„ Apache๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์ค‘์š”์„ฑ์„ ์ธ์‹ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ๋ฐ˜์˜ํ•œ Event MPM์„ ๊ฐœ๋ฐœ
        • ๊ธฐ์กด prefork(ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜)๊ณผ worker(์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜) MPM์˜ ๋‹จ์ ์„ ๋ณด์™„
        • ๋น„๋™๊ธฐ ๋ฐฉ์‹๊ณผ ์“ฐ๋ ˆ๋“œ ํ’€์„ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋ฐฉ์‹
    • ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ CPU๋ถ€ํ•˜๊ฐ€ ๊ธ‰์ฆํ•˜๋Š” ๋ฌธ์ œ์ (C10k(Connection 1000 problem)) ๋ฐœ์ƒ
    • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ Nginx๊ฐ€ ๋“ฑ์žฅ (2004๋…„)

 

๐Ÿ’ก Nginx

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

 

โ“Nginx๋Š” ์–ด๋–ป๊ฒŒ ์ˆ˜๋งŽ์€ ๋™์‹œ connection ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„๊นŒ

  Nginx์˜ ๋™์ž‘์›๋ฆฌ

  • ์„ค์ •ํŒŒ์ผ์„ ์ฝ๊ณ , ์„ค์ •์— ๋งž๊ฒŒ worker process๋ฅผ ์ƒ์„ฑํ•˜๋Š” master process๋กœ ๊ตฌ์„ฑ
    • Master Process
      • Nginx ์„œ๋ฒ„์˜ ๊ด€๋ฆฌ์™€ ์„ค์ •์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
      • ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง„ ์•Š์Œ Master Process
    • Worker Process
      • ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
      • ํ•œ๊ฐœ์˜ worker process๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
      • ์ƒ์„ฑ ์‹œ ์ง€์ •๋œ Listen ์†Œ์ผ“์„ ๋ฐฐ์ •๋ฐ›๊ณ , ๊ทธ ์†Œ์ผ“์— ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด connection์„ ํ˜•์„ฑํ•˜๊ณ , ์ด connection์€ ์ •ํ•ด์ง„ ์‹œ๊ฐ„(Keep-Alive)๋งŒํผ ์œ ์ง€
        ๋”๋ณด๊ธฐ

        Listen ์†Œ์ผ“

        • ์†Œ์ผ“(Socket)์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ†ต๋กœ
        • ์„œ๋ฒ„๊ฐ€ ํŠน์ • ํฌํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์œผ๋ ค๋ฉด, ๊ทธ ํฌํŠธ๋ฅผ ์—ด์–ด๋†“๊ณ  ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด Listen ์†Œ์ผ“
        • ์ฆ‰, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†Œ์ผ“
        • ์‰ฝ๊ฒŒ ๋งํ•ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ผ๋Š” ์˜๋ฏธ
        • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” Listen ์†Œ์ผ“์„ ํ†ตํ•ด ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ , ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
        • ์ฆ‰, ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ์ด ์„ฑ์‚ฌ๋˜๋ฉด Listen ์†Œ์ผ“์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์†Œ์ผ“์ด ์—ฐ๊ฒฐ์„ ๋‹ด๋‹น
      • worker process๋Š” ํ•ด๋‹น connection ํ•˜๋‚˜๋งŒ ๋‹ด๋‹นํ•˜์ง€ ์•Š๊ณ , ํ˜•์„ฑ๋œ connection์œผ๋กœ๋ถ€ํ„ฐ ์•„๋ฌด๋Ÿฐ ์š”์ฒญ์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด connection์„ ํ˜•์„ฑํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋‹ค๋ฅธ connection์œผ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•จ
      • ์ด๋Ÿฌํ•œ connection ํ˜•์„ฑ๊ณผ ์ œ๊ฑฐ, ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฒคํŠธ(Event) ๋ผ๊ณ  ํ•จ

  Nginx์˜ ํŠน์ง•

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ, ๊ฐ€๋ฒผ์šด ๋ฆฌ์†Œ์Šค๋กœ๋„ ๋†’์€ ๋™์‹œ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ
    • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ (Event-Driven)
      • ์ด๋ฒคํŠธ(Event)๋“ค์€ ํ(Queue) ํ˜•์‹์œผ๋กœ worker process์— ์ „๋‹ฌ๋˜๋ฉฐ, ์ด ์ด๋ฒคํŠธ๋“ค์€ ํ์— ๋‹ด๊ธด ์ƒํƒœ์—์„œ ๋น„๋™๊ธฐ ์ƒํƒœ๋กœ ๋Œ€๊ธฐ
      • worker process๋Š” ์ด ํ์—์„œ ํ•˜๋‚˜์”ฉ ์ด๋ฒคํŠธ๋ฅผ ๊บผ๋‚ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
      • ์ด๋Ÿฐ ๋ฐฉ์‹์€ worker process๊ฐ€ ์‰ฌ์ง€ ์•Š๊ณ  ์ผ์„ ํ•˜๊ธฐ์—, ์š”์ฒญ์ด ์—†์„ ๋•Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฉ์น˜์‹œํ‚ค๋Š” Apache Server๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์ธํ„ฐ๋„ท ์ ‘์†์„ ํ•  ๋•Œ ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋กœ ์ง์ ‘ ํ†ต์‹ ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ, ๊ทธ ์‚ฌ์ด์—์„œ ๋Œ€์‹  ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ”„๋ก์‹œ(Proxy)๋ผ๊ณ  ํ•จ
      • ํฌ์›Œ๋“œ ํ”„๋ก์‹œ(Forward Proxy)
        • ํ”„๋ก์‹œ ์„œ๋ฒ„ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋Œ€๋ฆฌํ•˜์—ฌ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„
      • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(Reverse Proxy)
        • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋Œ€๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„
      • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ฐ˜๋“œ์‹œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ, ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
        • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ : ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„๋ฐฐํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ท ๋“ฑํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ 
  • Nginx๋Š” ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹ฑํ•˜์—ฌ WAS์— ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š๋„๋ก ํ•จ
  • ์ด ์™ธ์—๋„ SSL/TLS ์•”ํ˜ธํ™”, URL ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์›น ์„œ๋ฒ„์˜ ์œ ์—ฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ

๐Ÿ’ก Nginx ์„ค์ • ์ฝ”๋“œ ์˜ˆ์‹œ

1. Nginx ๊ธฐ๋ณธ ์„ค์ •

user nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;;
  • user nginx;
    • Nginx๊ฐ€ ์–ด๋–ค ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋ ์ง€ ์„ค์ •
    • ๋ณดํ†ต nginx ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰
  • worker_processes auto;
    • Nginx๊ฐ€ ์‚ฌ์šฉํ•  ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜๋ฅผ ์„ค์ •
    • auto๋Š” CPU ์ฝ”์–ด ์ˆ˜์— ๋งž์ถฐ ์ž๋™์œผ๋กœ ์„ค์ •
  • error_log์™€ pid: ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ ๊ฒฝ๋กœ์™€ PID ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

2. events ๋ธ”๋ก

events {
    worker_connections 1024;
}
  • worker_connections 1024;
    • ๊ฐ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์„ค์ •
    • ์—ฌ๊ธฐ์„œ๋Š” 1024๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

3. http ๋ธ”๋ก

: http ๋ธ”๋ก ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ์„ค์ •์„ ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ upstream๊ณผ server ๋ถ€๋ถ„์ด ์ค‘์š”

 

upstream ๋ธ”๋ก

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

	# ๋ฐฑ์—”๋“œ upstream ์„ค์ •
    # upstream myweb-api {
    #     server api:8080;
    # }

	# ํ”„๋ก ํŠธ์—”๋“œ upstream ์„ค์ •
    upstream next-server {
        server 172.17.0.1:3000; # docker๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด localhost:3000(์›น์„œ๋ฒ„์ฃผ์†Œ)
    }
  • upstream next-server
    • ์—ฌ๋Ÿฌ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ธ”๋ก์œผ๋กœ, ์—ฌ๊ธฐ์„œ๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„(172.17.0.1:3000)๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” Nginx๊ฐ€ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ์„œ๋ฒ„
    • ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด upstream์— ์—ฌ๋Ÿฌ server ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ์Œ

server ๋ธ”๋ก

    server {
        listen 80;

		# /api ๊ฒฝ๋กœ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ upstream ์˜ /api ๊ฒฝ๋กœ๋กœ ํฌ์›Œ๋”ฉ
        # location /api {
        #     proxy_pass         http://myweb-api/api;
        # }

		# / ๊ฒฝ๋กœ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ ํ”„๋ก ํŠธ์—”๋“œ upstream ์˜ / ๊ฒฝ๋กœ๋กœ ํฌ์›Œ๋”ฉ
        location / {
            proxy_pass         http://next-server/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
  • listen 80;
    • Nginx๊ฐ€ 80๋ฒˆ ํฌํŠธ(HTTP ๊ธฐ๋ณธ ํฌํŠธ)์—์„œ ์š”์ฒญ์„ ๋“ฃ๋„๋ก ์„ค์ •
  • location /
    • / ๊ฒฝ๋กœ๋กœ ์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ •์˜
  • proxy_pass http://next-server/;
    • /๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ upstream์— ์ •์˜๋œ next-server๋กœ ์ „๋‹ฌ
    • ์ฆ‰, http://172.17.0.1:3000/์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ„
  • proxy_http_version 1.1
    • HTTP/1.1์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
  •  proxy_set_header
    • ํ”„๋ก์‹œ ์š”์ฒญ ์‹œ ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ์š”์ฒญ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Upgrade์™€ Connection ํ—ค๋”๋Š” WebSocket ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •
  • proxy_cache_bypass $http_upgrade;
    • WebSocket ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ ํ—ค๋”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ์šฐํšŒํ•˜๋„๋ก ์„ค์ •

4. ์ž‘๋™ ์›๋ฆฌ

  1. ์‚ฌ์šฉ์ž๊ฐ€ Nginx ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด, http://localhost:80/ ์ฃผ์†Œ๋กœ ์ ‘๊ทผ)
  2. Nginx๋Š” location / ๋ธ”๋ก์—์„œ proxy_pass๋กœ ์ง€์ •๋œ next-server์— ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค.
    (์ด ๊ฒฝ์šฐ next-server๋Š” upstream ๋ธ”๋ก์—์„œ ์ •์˜ํ•œ 172.17.0.1:3000 ์„œ๋ฒ„)
  3. ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„ (์˜ˆ: Next.js)๊ฐ€ 172.17.0.1:3000์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์ด ์„œ๋ฒ„๊ฐ€ ์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ Nginx๋กœ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค.
  4. Nginx๋Š” ๋ฐ›์€ ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

5. ์„ค์ •์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„

  • proxy_pass
    •  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ํŠน์ • ์„œ๋ฒ„(์—ฌ๊ธฐ์„œ๋Š” next-server)๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•จ
  • upstream
    • ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋ฅผ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์„ค์ •์œผ๋กœ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ์ •์˜ํ•˜์—ฌ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ์Œ
  • proxy_set_header:
    • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ ์ผ๋ถ€ ํ—ค๋”๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
      ์˜ˆ๋ฅผ ๋“ค์–ด, WebSocket์„ ์ง€์›ํ•˜๋ ค๋ฉด Upgrade ๋ฐ Connection ํ—ค๋”๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ

 

'Study > Web, Server' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํŒŒ์ด์ฌ ์›น ํ”„๋ ˆ์ž„์›Œํฌ  (0) 2025.04.29