TIL-083 | Nginx ๋ž€?

Lee, Chankyuยท2022๋…„ 2์›” 17์ผ
0

Computer Science

๋ชฉ๋ก ๋ณด๊ธฐ
10/12
post-thumbnail

๐ŸŒˆ Nginx

Nginx ๋ž€?

  • ์—”์ง„์—‘์Šค(Nginx)๋Š” ๋™์„œ์ ‘์† ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ๊ฒฝ๋Ÿ‰ ์›น ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

  • Apache๋ณด๋‹ค ๋™์ž‘์ด ๋‹จ์ˆœํ•˜๊ณ , ์ „๋‹ฌ์ž ์—ญํ• ๋งŒ ํ•œ๋‹ค.

  • HTTP Web Server๋กœ ํ™œ์šฉ๋˜๋ฉฐ, Reverse Proxy Server๋กœ ํ™œ์šฉํ•˜์—ฌ WAS ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ๋„ ํ™œ์šฉ๋œ๋‹ค.

Nginx์˜ ์—ญํ• 

1. HTTP Server๋กœ์„œ ์ •์  ํŒŒ์ผ์„ serve ํ•œ๋‹ค.

  • Apache ์„œ๋ฒ„์™€์˜ ์ฐจ์ด

    • Apache ์›น ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์š”์ฒญ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ ‘์†ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์œผ๋ฉด ๊ทธ๋งŒํผ ์“ฐ๋ ˆ๋“œ๋„ ์ƒ์„ฑ๋˜์–ด CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์˜ ์†Œ๋ชจ๊ฐ€ ์ปค์ง„๋‹ค.
    • Nginx๋Š” Event-Driven ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜์—ฌ ํ•œ ๊ฐœ ๋˜๋Š” ๊ณ ์ •๋œ ํ”„๋กœ์„ธ์Šค๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ , ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ๋“ค์„ Concurrencyํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ ๋น„์šฉ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์ ์€ ์ž์›์œผ๋กœ ํšจ์œจ์ ์ธ ์šด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ์  ๋•Œ๋ฌธ์— ๋‹จ์ผ ์„œ๋ฒ„์—์„œ๋„ ๋™์‹œ์— ๋งŽ์€ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋กœ์„œ์˜ ์—ญํ• 

  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ž€ ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ ‘๊ทผ ์‹œ, ์ค‘๊ฐ„์—์„œ ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•˜์—ฌ ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์„œ๋ฒ„์ด๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ€์งœ ์„œ๋ฒ„์— requestํ•˜๋ฉด ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ๋ฐฐํ›„ ์„œ๋ฒ„(reverse server)๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ Nginx, ๋ฆฌ๋ฒ„์Šค ์„œ๋ฒ„๊ฐ€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ํ™œ์šฉํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ๋ณด์•ˆ : ์™ธ๋ถ€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋‚ด๋ถ€๋ง์— ์žˆ๋Š” ์„œ๋ฒ„์˜ ์กด์žฌ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ ๋ฐ›์œผ๋ฉฐ, ๋งคํ•‘๋˜๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค. ๋˜ํ•œ Nginx๋Š” SSL ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ : ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ถ€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค๋ฉฐ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›น ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์„œ๋ฒ„์—๋Š” ์š”์ฒญ(request)์— ๋Œ€ํ•œ ๋ฒ„ํผ๋ง์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ App ์„œ๋ฒ„์— ์ง์ ‘ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋กœ์„ธ์Šค 1๊ฐœ๊ฐ€ ์‘๋‹ต ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋‘ ์œผ๋กœ์จ ์š”์ฒญ์„ ๋ฐฐ๋ถ„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Nginx์˜ ๊ตฌ์กฐ

  • ํ•˜๋‚˜์˜ Master Process์™€ ๋‹ค์ˆ˜์˜ Worker Process๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.
  • Master Process๋Š” ์„ค์ • ํŒŒ์ผ์„ ์ฝ๊ณ  ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ, Worker Process๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์€ Worker Process์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • Nginx๋Š” Worker Process ์‚ฌ์ด์— ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฐฐํ•˜๊ธฐ ์œ„ํ•ด OS์— ์˜์กด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • Worker Process์˜ ๊ฐœ์ˆ˜๋Š” ์„ค์ • ํŒŒ์ผ์—์„œ ์ •์˜๋˜๋ฉฐ, ์ •์˜๋œ ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CPU ์ฝ”์–ด ์ˆซ์ž์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์กฐ์ •๋œ๋‹ค.


Appendix

WAS(Web Application Server)

  • ์›น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋™์ ์ธ ์š”์ฒญ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„์ด๋‹ค. ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฑ์—”๋“œ๋ฅผ WAS๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ ๋“ฏํ•˜๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์™€ ๊ฐ™์ด ๊ด€๋ฆฌ๋œ๋‹ค.

Django์™€ WSGI, ๊ทธ๋ฆฌ๊ณ  Gunicorn

  • Django๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์›น์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ๋ฐ›์„ ๋•Œ WSGI๋ผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

  • WSGI(Web Server Gateway Interface)๋Š” ์ด๋ฆ„๋งŒ ๋ด๋„ ์›น์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒ”์šฉ์ ์ธ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ• ์ˆ˜๋„ ์žˆ์ง€๋งŒ WSGI๋Š” ์˜ค์ง ํŒŒ์ด์ฌ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์›น ์„œ๋ฒ„์—์„œ ์ „๋‹ฌํ•ด์ฃผ๋Š” HttpRequest๋“ค์„ ํŒŒ์ด์ฌ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ํ•ด์„ํ•ด์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ๋งก๊ฒŒ๋œ๋‹ค. Django๋Š” Python์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ณ  ๋”ฐ๋ผ์„œ Django์™€ ์›น์„œ๋ฒ„๋ฅผ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„  WSGI๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • Django์—๋Š” runserver๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ runserver๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์ฒ˜๋ฆฌ๋Šฅ๋ ฅ์ด ํ˜„์ €ํžˆ ๋–จ์–ด์ง€๋Š” ๋‹จ์  ๋•Œ๋ฌธ์— ์‹ค์ œ ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋ž˜์„œ WSGI๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋œ๋‹ค. WSGI๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ๋งŽ์•„์ ธ๋„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. WSGI์˜ ์ข…๋ฅ˜์—๋Š” uwsgi, gunicorn์ด ์–‘๋Œ€์‚ฐ๋งฅ์œผ๋กœ ์žˆ์ง€๋งŒ ์ตœ๊ทผ gunicorn์˜ ์„ฑ๋Šฅ์ด uwsgi๋ณด๋‹ค ์ข‹์•„์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ gunicorn์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

  • ๋”ฐ๋ผ์„œ Django์˜ WSGI๋กœ gunicorn์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๊ณ  Django์™€ gunicorn์„ ํ•ฉ์ณ์„œ WAS๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


๐Ÿ“ Reference

  1. https://whatisthenext.tistory.com/123
  2. https://hyeo-noo.tistory.com/205
  3. https://icarus8050.tistory.com/57
profile
Backend Developer - "Growth itself contains the germ of happiness"

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด