OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜์šฐ๋ฆฌ๋Š” ํšŒ์˜ ๋ณด๊ณ ์„œ์˜ ์‚ฌ๋ณธ์„ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. HighLoad ++ 2016๋…„ 7์›” 8~XNUMX์ผ ๋ชจ์Šคํฌ๋ฐ” ๊ทผ์ฒ˜ ์Šค์ฝœ์ฝ”๋ณด์—์„œ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ผ๋””๋ฏธ๋ฅด ํ”„๋กœํƒ€์†Œํ”„ OpenResty์™€ Lua๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NGINX ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ๋ธ”๋ผ๋””๋ฏธ๋ฅด ํ”„๋กœํƒ€์†Œํ”„์ด๊ณ  Parallels์—์„œ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ œ ์ธ์ƒ์˜ 4๋ถ„์˜ 3์„ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๋ฐ ๋ฐ”์นฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ํ•ต์‹ฌ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋” ๊ฟˆ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ธ์ƒ์˜ 4๋ถ„์˜ 1์€ ์‚ฐ์—… ๊ฐœ๋ฐœ๋กœ, ๋ฐ”๋กœ ์ƒ์‚ฐ์— ํˆฌ์ž…๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ์ผ๋ถ€๋Š” ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ชจ๋“  ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋‚˜์œ์ง€ ์ดํ•ดํ•˜๊ฒŒ ํ•ด์ฃผ์„ธ์š”. ์ œ๊ฐ€ ์•„์ง ์ดˆ๋ณด์˜€์„ ๋•Œ, ๊ทธ๋“ค์€ ์ €์—๊ฒŒ 100ํ…Œ๋ผ๋ฐ”์ดํŠธ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถ€๋‹ด์ด ํฐ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ปจํผ๋Ÿฐ์Šค์— ๊ฐ€์„œ "์—ฌ๋Ÿฌ๋ถ„, ๋น…๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋“  ๋ฉด์—์„œ ๊ดœ์ฐฎ์€ ๊ฑด๊ฐ€์š”? ๊ฑฐ๊ธฐ ๊ธฐ๋ฐ˜์€ ์–ผ๋งˆ๋‚˜ ๋˜์‹œ๋‚˜์š”?"๋ผ๊ณ  ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ž ๊ทธ๋“ค์€ "100๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค!"๋ผ๊ณ  ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. "๋ฉ‹์ง€๋„ค, XNUMX๊ธฐ๊ฐ€๋ฐ”์ดํŠธ!"๋ผ๊ณ  ๋งํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ํฌ์ปคํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. "์ด ์‚ฌ๋žŒ๋“ค ๋ฉ‹์ง€๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ๋Œ์•„์™€์„œ ํ…Œ๋ผ๋ฐ”์ดํŠธ๊ธ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žฅ๋‚œ์น˜๋Š” ๊ฑฐ์ฃ . ์ดˆ๋ณด๋ผ๊ณ  ํ•˜๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ํฐ ํƒ€๊ฒฉ์ธ์ง€ ์ƒ์ƒ์ด ๊ฐ€์‹œ๋‚˜์š”?

์ €๋Š” 20๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ์ œ๊ฐ€ ์ผํ•˜๋ฉด์„œ ์•Œ์•„๋‚ด์•ผ ํ–ˆ๋˜ ์ ์ด์—์š”. Erlang, C, C++, Lua, Python, Ruby ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด๋ฅผ ๋ชจ๋‘ ์ž˜๋ผ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๊ทธ๋Ÿด ์ˆ˜๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ˆซ์ž๋ฅผ ์„ธ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, 20๋ฒˆ์งธ์ฏค์—์„œ ์ˆซ์ž๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด Parallels๊ฐ€ ๋ฌด์—‡์ด๊ณ  ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„์ง€, ๋ฌด์—‡์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ „ ์„ธ๊ณ„์— 13๊ฐœ์˜ ์‚ฌ๋ฌด์‹ค์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ, ์ง์›์€ 300๋ช…์ด ๋„˜๊ณ , ๋ชจ์Šคํฌ๋ฐ”, ํƒˆ๋ฆฐ, ๋ชฐํƒ€์— ๊ฐœ๋ฐœํŒ€์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒจ์šธ์— ์ถ”์›Œ์„œ ๋“ฑ์„ ๋”ฐ๋œปํ•˜๊ฒŒ ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ชฐํƒ€๋กœ ์ด์‚ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ €ํฌ ๋ถ€์„œ๋Š” Python 2๋กœ๋งŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์—…์„ ํ•˜๊ณ  ์žˆ์–ด์„œ ์ตœ์‹  ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•  ์‹œ๊ฐ„์ด ์—†์–ด์„œ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Django๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋“ค์–ด์žˆ๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ œ๊ฑฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ MySQL, Redis, NGINX๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐ–์—๋„ ๋ฉ‹์ง„ ์ƒํ’ˆ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” MongoDB๋„ ์žˆ๊ณ , ํ† ๋ผ๋„ ๋›ฐ์–ด๋‹ค๋‹ˆ๊ณ , ๋ชจ๋“  ๊ฑธ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์€ ๋‚ด ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๋‚˜๋Š” ๊ทธ๋Ÿฐ ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜คํ”ˆ๋ฆฌ์Šค ํ‹ฐ

๋‚˜๋Š” ๋‚ด ์ž์‹ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๋ฌด์Šจ ์ด์•ผ๊ธฐ๋ฅผ ํ• ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • OpenResty๋ž€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?
  • Python, NodeJS, PHP, Go ๋“ฑ ๋ชจ๋‘๊ฐ€ ๋งŒ์กฑํ•˜๋Š” ๋ฉ‹์ง„ ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ ์™œ ๋ฐ”ํ€ด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  • ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์ƒํ™œ์—์„œ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ๊ฐ€ 3,5์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์ด๋ผ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž˜๋ผ์•ผ ํ–ˆ๊ณ , ์˜ˆ์‹œ๋„ ๊ฑฐ์˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค.

OpenResty๋Š” NGINX์ž…๋‹ˆ๋‹ค. ๊ทธ ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘์„ฑ๋˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์™„๋ฒฝํ•œ ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์ด ํ”„๋กœ๋•์…˜์—์„œ NGINX๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ทธ๊ฐ€ ๋น ๋ฅด๊ณ  ๋ฉ‹์ง„ ์‚ฌ๋žŒ์ด๋ผ๋Š” ๊ฑธ ์•Œ๊ณ  ์žˆ์ฃ . ๊ทธ๋“ค์€ ๋ฉ‹์ง„ ๋™๊ธฐ์‹ I/O๋ฅผ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Python์—์„œ gevent๋ฅผ ์ˆœํ™˜ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ˆœํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Gevent๋Š” ๋ฉ‹์ง€๊ณ  ๊ต‰์žฅํ•˜์ง€๋งŒ, C ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด gevent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋ฏธ์น  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋Ÿฐ ๊ฒฝํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ ๊ผฌ๋ฐ• ์ดํ‹€์ด โ€‹โ€‹๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ช‡ ์ฃผ ๋™์•ˆ ์กฐ์‚ฌํ•˜์ง€ ์•Š๊ณ , ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด์ง€ ์•Š๊ณ , ์ธํ„ฐ๋„ท์— ๊ธ€์„ ์˜ฌ๋ฆฌ์ง€ ์•Š์•˜๊ณ , ๊ตฌ๊ธ€์—์„œ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์™„์ „ํžˆ ๋ฏธ์ณ๋ฒ„๋ ธ์„ ๊ฒ๋‹ˆ๋‹ค.

NGINX์—๋Š” ์ด๋ฏธ ์บ์‹ฑ๊ณผ ์ •์  ์ฝ˜ํ…์ธ ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ธ๋„์ ์ธ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์„์ง€, ์–ด๋”˜๊ฐ€์—์„œ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์„์ง€, ์–ด๋”˜๊ฐ€์—์„œ ์„ค๋ช…์ž๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š์„์ง€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Nginx๋Š” ๋ฐฐํฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. WSGI, PHP-FPM, Gunicorn, Unicorn ์ค‘ ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Nginx๊ฐ€ ์„ค์น˜๋˜์–ด ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ œ๊ณต๋˜๋ฏ€๋กœ ๊ด€๋ฆฌ์ž๋Š” Nginx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Nginx๋Š” ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์ž์„ธํžˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๋‹จ๊ณ„, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Nginx๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๋“ค์ด ์„ค์ •์— ์ง‘์–ด๋„ฃ์€ ๋ชจ๋“  ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์œ ์—ฐ์„ฑ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํž˜์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํƒ€์˜ค๋ฐ”์˜ค ์‚ฌ๋žŒ๋“ค์€ ์˜ค๋ž˜์ „, ์•ฝ 8๋…„ ์ „์— ๋ฃจ์•„๋ฅผ ์•ฑ์— ๋‚ด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์—‡์„ ์ฃผ๋‚˜์š”?

  • ํฌ๊ธฐ. ๊ทธ๋Š” ํ‚ค๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค. LuaJIT์€ ์•ฝ 100~200KB์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์ตœ์†Œํ•œ์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์†๋„. LuaJIT ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋งŽ์€ ์ƒํ™ฉ์—์„œ C์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” Java๋ณด๋‹ค ๋–จ์–ด์ง€๊ณ , ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” Java๋ณด๋‹ค ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ•œ๋™์•ˆ ์ด๋Š” ์ตœ์ฒจ๋‹จ์ด์ž ๊ฐ€์žฅ ๋ฉ‹์ง„ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์—ฌ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๋” ๋ฉ‹์ง„ ๋ชจ๋ธ๋„ ์žˆ์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด V8 ์—”์ง„์ด ๋‹ฌ๋ฆฐ ๋ชจ๋ธ์€ ๋งค์šฐ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ JS ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ Java์˜ HotSpot์€ ์–ด๋–ค ๋ถ€๋ถ„์—์„œ๋Š” ๋” ๋น ๋ฅด์ง€๋งŒ, ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋’ค์ฒ˜์ง‘๋‹ˆ๋‹ค.
  • ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Perl ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ์žˆ๊ณ  Booking.com์ด ์•„๋‹ˆ๋ผ๋ฉด Perl ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ๋นผ์•—๊ฒผ๊ณ , ๊ทธ๋“ค์„ ๊ฐ€๋ฅด์น˜๋Š” ์ผ์€ ๊ธธ๊ณ  ํž˜๋“ญ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„์•ผ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๊ทธ๋“ค์„ ์žฌ๊ต์œกํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ฐพ์•„์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Lua์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฃจ์•„๋Š” ์ดˆ๊ธ‰์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ 3์ผ ๋งŒ์— ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์•ฝ 2์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. 2์‹œ๊ฐ„ ๋งŒ์— ์ €๋Š” ์ด๋ฏธ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ ํ›„ ๊ทธ๋Š” ๋ฐ”๋กœ ์ œ์ž‘์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. OpenResty๋Š” Lua์™€ Engine์„ ๋ชจ๋‘ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๋ชจ๋“  ๊ฒƒ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค - ๋ฐฐ์น˜ํ•˜๊ณ  ์ž‘๋™์‹œํ‚ค์„ธ์š”.

์˜ˆ

๊ฐ€์‚ฌ๋Š” ์ด์ œ ๊ทธ๋งŒํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ Hello World๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์—ฌ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ๋‚˜์š”? ์ด๊ณณ์€ ์—”์ง„์Šค ๋งค์žฅ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ , ์šฐ๋ฆฌ๋งŒ์˜ ๋ผ์šฐํŒ…์„ ์ž‘์„ฑํ•˜์ง€๋„ ์•Š๊ณ , ๊ธฐ์„ฑ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ NGINX์— ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋‹ˆ๊นŒ, ์šฐ๋ฆฌ๋Š” ๊ฒŒ์œผ๋ฅด๊ฒŒ ์ž˜ ์ง€๋ƒ…๋‹ˆ๋‹ค.

content_by_lua_block โ€“ ์ด๋Š” Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Engins ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค remote_addr ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ผ์šด๋‹ค string.format. ๊ทธ๊ฒƒ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค sprintf, Lua์—์„œ๋งŒ, ์˜ค์ง ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ๊ฐ์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

ํ•˜์ง€๋งŒ ํ˜„์‹ค ์„ธ๊ณ„๋กœ ๋Œ์•„์™€๋ณด์ฃ . ์•„๋ฌด๋„ Hello World๋ฅผ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๊ฐœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๊ฐ€์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

๊ทธ๋ƒฅ ์•‰์•„์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฑด ๋ณ„๋กœ ์ข‹์ง€ ์•Š์•„์š”. ์‚ฌ์šฉ์ž๊ฐ€ 100.000๋งŒ ๋ช…์ด ๋˜๋ฉด ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ์–‘์ด ์‚ฌ์ง„์„ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ๊ฒ€์ƒ‰๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ‚ค์›Œ๋“œ๋ฅผ ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ "์ƒˆ๋ผ ๊ณ ์–‘์ด"๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ณ ์–‘์ด, ํ„ธ์ด ๋งŽ์€ ๊ณ ์–‘์ด ๋“ฑ์„ ์ฐพ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๋ฐฑ์—”๋“œ์—์„œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

๋‘ ์ค„๋งŒ ์‚ฌ์šฉํ•˜๋ฉด GET ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ํ‚ค์›Œ๋“œ์™€ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ผ๋ฐ˜ SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜์ฃ . ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

๋„์„œ๊ด€ ์—ฐ๊ฒฐ resty.mysql, ์ด๋ฏธ ํ‚คํŠธ์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ SQL ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์—ฌ๊ธฐ๋Š” ์กฐ๊ธˆ ๋ฌด์„ญ์ง€๋งŒ ๋ชจ๋“  ๊ฒŒ ์ž˜ ๋Œ์•„๊ฐ€์š”. ์—ฌ๊ธฐ์„œ๋Š” 10์ด ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒŒ์œผ๋ฅด๊ณ , ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SQL์˜ ์ œํ•œ์„ ์žŠ์–ด๋ฒ„๋ ธ๋„ค์š”.

๋‹ค์Œ์œผ๋กœ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ Lua ํ…Œ์ด๋ธ”์— ์ฑ„์›๋‹ˆ๋‹ค. reqs, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ•ฉ๋‹ˆ๋‹ค ngx.location.capture_multi.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์ด ๋ชจ๋“  ์š”์ฒญ์€ ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ๋‹ต๋ณ€์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์‹œ๊ฐ„์€ ๊ฐ€์žฅ ๋А๋ฆฐ ๊ฒƒ์˜ ์‘๋‹ต ์‹œ๊ฐ„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ 50๋ฐ€๋ฆฌ์ดˆ ์•ˆ์— ๋ชจ๋‘ ์‘๋‹ตํ•˜๊ณ , 50๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด, XNUMX๋ฐ€๋ฆฌ์ดˆ ์•ˆ์— ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฒŒ์œผ๋ฅด๊ณ  HTTP ์ฒ˜๋ฆฌ์™€ ์บ์‹ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— NGINX๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์š”์ฒญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. url/fetch, ์—ฌ๊ธฐ ๊ทธ๋Š”:

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค proxy_pass์บ์‹œํ•  ์œ„์น˜์™€ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์•„์ด๋””์–ด๋Š” ๋ชจ๋“  ๊ฒƒ์„ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ๋‘ ์ค„๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Content-Type์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  JSON์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” JSON์„ ์ฝ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ฒ˜์Œ์—๋Š” ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SEO ์ „๋ฌธ๊ฐ€๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋”๋ผ๋„, ๊ทธ๋“ค์€ ๊ฒ€์ƒ‰ ์—”์ง„์ด ์šฐ๋ฆฌ์— ๋Œ€ํ•œ ์–ด๋–ค ๊ฒƒ๋„ ์ƒ‰์ธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋ฌผ๋ก , ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ HTML์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋„์„œ๊ด€์ด ์žˆ์Šต๋‹ˆ๋‹ค. lua-resty-template.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์•„๋งˆ๋„ OPM์ด๋ผ๋Š” ๋ฌด์„œ์šด ์„ธ ๊ธ€์ž๋ฅผ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. OpenResty์—๋Š” ์ž์ฒด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ํŠนํžˆ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. lua-resty-template. ์ด๋Š” Django ํ…œํ”Œ๋ฆฟ๊ณผ ๋น„์Šทํ•œ ๊ฐ„๋‹จํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‘ ์ค„๋กœ ๋‹ค์‹œ ํ…œํ”Œ๋ฆฟ์„ ๋ Œ๋”๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๊ณ ์–‘์ด๋ฅผ ๋ฐ›์•„์„œ ํ–‰๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญ์„ ํ™•๋Œ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Š” ์ƒˆ๋ผ ๊ณ ์–‘์ด์™€ ํ•จ๊ป˜ ๋ฌผ๊ฐœ๋„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์•Œ๊ฒ ๋Š”๊ฐ€, ์–ด์ฉŒ๋ฉด ๊ทธ๋Š” ์ •ํ™•ํžˆ ๊ทธ๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์—ˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ์š”์ฒญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋ฉ‹์ง€์ง€๋งŒ, ์•„์ง ๊ฐœ๋ฐœ ์ค‘์ด๋ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šน์ธ์„ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด OpenResty ๊ด€์ ์—์„œ NGINX๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ - ACCESS์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ๋„์ฐฉํ–ˆ์„ ๋•Œ, ํ—ค๋”, IP ์ฃผ์†Œ, ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ฐ”๋กœ ์ž˜๋ผ๋‚ผ ์ˆ˜๋„ ์žˆ์–ด์š”. ์ด๋Š” ์Šน์ธ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์š”์ฒญ์ด ๋งŽ์„ ๊ฒฝ์šฐ ์ด ๋‹จ๊ณ„์—์„œ ์‰ฝ๊ฒŒ ์š”์ฒญ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์ณ ์“ฐ๊ธฐ. ์ผ๋ถ€ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์œ ๋Ÿ‰. ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ—ค๋” ํ•„ํ„ฐ. ์‘๋‹ต ํ—ค๋”๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด proxy_pass์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ์ผ๋ถ€ ํ—ค๋”๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ”๋”” ํ•„ํ„ฐ. ์šฐ๋ฆฌ๋Š” ์‹ ์ฒด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ก โ€” ๋กœ๊น…. ์ถ”๊ฐ€์ ์ธ ๊ณ„์ธต ์—†์ด Elasticsearch์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์Šน์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. location, ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ์„ค๋ช…ํ•œ ๋Œ€๋กœ, ๊ฑฐ๊ธฐ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค:

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์ฟ ํ‚ค ํ† ํฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์Šน์ธ์„ ์œ„ํ•ด ์ด๋ฅผ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋˜‘๋˜‘ํ•ด์„œ ์ฟ ํ‚ค ํ† ํฐ์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Redis์—๋„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

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

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

๊ถŒํ•œ ๋ถ€์—ฌ ์ž์ฒด๋ฅผ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์š”์ฒญ ๋ณธ๋ฌธ์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. POST ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ๋กœ๊ทธ์ธ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์Šน์ธ์„ ์œ„ํ•ด ์ •๋ณด๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๊ทธ๋“ค์ด ๋งž๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ํ† ํฐ์„ Redis์— ์”๋‹ˆ๋‹ค:

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์ด ์ž‘์—…๋„ ๋‘ ์ค„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

OpenResty: NGINX๋ฅผ ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

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

  • ์ตœ์†Œํ•œ์˜ ๋ฐฑ์—”๋“œ. ๋•Œ๋กœ๋Š” ๋ฐฑ์—”๋“œ์— ์•„์ฃผ ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ๋‚ ์งœ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์–ด๋”˜๊ฐ€์— ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ์‚ฌ์ดํŠธ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ์นด์šดํ„ฐ๋‚˜ ํ†ต๊ณ„๋ฅผ ์ฒจ๋ถ€ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ž‘์€ ์ผ์ด์ฃ . ์•„์ฃผ ์‰ฝ๊ฒŒ ์ตœ์†Œํ•œ์˜ ์กฐ๊ฐํ’ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋น ๋ฅด๊ณ , ์‰ฝ๊ณ , ๋ฉ‹์ง€๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ. ๊ฐ€๋” ์šฐ๋ฆฌ๋Š” ํŽ˜์ด์ง€์— ๊ด‘๊ณ ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋Š” API ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ด‘๊ณ ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋งค์šฐ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ์žˆ๋Š” ๋ฐฑ์—”๋“œ์— ๊ณผ๋ถ€ํ•˜๋ฅผ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์ ธ๊ฐ€์„œ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ช‡๋ช‡ JS๋ฅผ ํ•˜๋‚˜๋กœ ๋ถ™์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋ฐ˜๋Œ€๋กœ ๊ทธ๊ฒƒ์„ ํ’€์–ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ Facade. ์ด๊ฒƒ ์—ญ์‹œ ๋งค์šฐ ์ข‹์€ ์‚ฌ๋ก€์ด๊ณ , ์ œ๊ฐ€ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์—๋Š” ์ „์ž ๋ณด๊ณ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ตญ๋‚ด ๋ฒ•์ธ์˜ ์ ˆ๋ฐ˜ ๊ฐ€๋Ÿ‰์— ๋ณด๊ณ  ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํšŒ์‚ฌ์ธ Tenzor์—์„œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ผ์šฐํŒ…, ๊ถŒํ•œ ๋ถ€์—ฌ ๋“ฑ ๋งŽ์€ ์ž‘์—…์„ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    OpenResty๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ ‘์ฐฉ์ œ ์—ญํ• ์„ ํ•˜๋ฉฐ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋‹จ์ผ ์•ก์„ธ์Šค์™€ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” Node.js, PHP, Python, Erlang ๋“ฑ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ณณ์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OpenResty๋ฅผ ์ „๋ฉด์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ†ต๊ณ„ ๋ฐ ๋ถ„์„. ์ผ๋ฐ˜์ ์œผ๋กœ NGINX๊ฐ€ ์ž…๊ตฌ์— ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์š”์ฒญ์€ ์ด๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ณณ์€ ์กฐ๋ฆฝํ•˜๊ธฐ์— ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Elasticsearch, Logstash์™€ ๊ฐ™์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฆ‰์‹œ ๊ณ„์‚ฐํ•˜์—ฌ ์–ด๋”˜๊ฐ€์— ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐ„๋‹จํžˆ ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ ๋‹ค์Œ ์–ด๋”˜๊ฐ€๋กœ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ์‹œ์Šคํ…œ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜จ๋ผ์ธ ๊ฒŒ์ž„๋„ ๋งŒ๋“ค๊ธฐ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ผ€์ดํ”„ํƒ€์šด์—์„œ Alexander Gladysh๋Š” OpenResty๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ ํ•„ํ„ฐ๋ง(WAF). ์š”์ฆ˜์€ ์˜จ๊ฐ– ์ข…๋ฅ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ํ–‰์ด๋ฉฐ, ์ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. OpenResty์˜ ๋„์›€์œผ๋กœ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด PHP๋Š” ์ „ํ˜€ ์ฃผ์ž…๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฝ˜์†” ์–ด๋”˜๊ฐ€์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ง์ด์ฃ . MySQL๊ณผ Python์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ๊ณ„์‹œ์ฃ ? ์•„๋งˆ๋„ ๊ทธ๋“ค์€ ์—ฌ๊ธฐ์„œ ๋””๋ ‰ํ† ๋ฆฌ ํƒ์ƒ‰์„ ์‹œ๋„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ณ  ์ €๋ ดํ•˜๊ฒŒ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ญ ์‚ฌํšŒ. OpenResty๋Š” NGINX ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด๋„ˆ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. NGINX ์ปค๋ฎค๋‹ˆํ‹ฐ. ๊ทœ๋ชจ๊ฐ€ ๋งค์šฐ ํฌ๊ณ  ์ฒ˜์Œ์— ๊ถ๊ธˆํ•ดํ•  ์งˆ๋ฌธ ์ค‘ ์ƒ๋‹น์ˆ˜๋Š” NGINX ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด๋ฏธ ๋‹ต๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

    Lua ๊ฐœ๋ฐœ์ž๋“ค. ์–ด์ œ HighLoad++ ๊ต์œก์— ์ฐธ์„ํ•œ ์‚ฌ๋žŒ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„์—ˆ๋Š”๋ฐ, Tarantool๋งŒ Lua๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฃจ์•„์–ด๋กœ ์“ฐ์—ฌ์ง„ ๋‚ด์šฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ: OpenResty, Prosody XMPP ์„œ๋ฒ„, Love2D ๊ฒŒ์ž„ ์—”์ง„, Warcraft์—์„œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ Lua ๋“ฑ. Lua ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ๊ณ , ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ฐ˜์‘์ด ๋น ๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Lua์— ๋Œ€ํ•œ ๋ชจ๋“  ์งˆ๋ฌธ์€ ๋ช‡ ์‹œ๊ฐ„ ๋‚ด์— ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ๊ธ€์„ ์“ฐ๋ฉด ๋ช‡ ๋ถ„ ์•ˆ์— ์ด๋ฏธ ๋งŽ์€ ๋‹ต๋ณ€์ด ์˜ต๋‹ˆ๋‹ค. ๋ฌด์Šจ ๋‚ด์šฉ์ธ์ง€, ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€, ๋ฌด์—‡์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๋Š” ๋‹ต๋ณ€์ด์š”. ์ •๋ง ๋ฉ‹์ง€๋„ค์š”. ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด์ฒ˜๋Ÿผ ์นœ์ ˆํ•˜๊ณ  ๋”ฐ๋œปํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ชจ๋“  ๊ณณ์— ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
    OpenResty์—๋Š” GitHub์ด ์žˆ๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๊ฑฐ๊ธฐ์„œ ์ด์Šˆ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google ๊ทธ๋ฃน์—๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ผ๋ง ๋ชฉ๋ก์ด ์žˆ๊ณ , ์ค‘๊ตญ์–ด๋กœ ๋œ ๋ฉ”์ผ๋ง ๋ชฉ๋ก๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์–ด๋ฅผ ๋ชปํ•˜๋”๋ผ๋„ ์ค‘๊ตญ์–ด๋Š” ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

  • OpenResty๊ฐ€ ์›น์— ๋งž์ถฐ ๋งŒ๋“ค์–ด์ง„ ๋งค์šฐ ํŽธ๋ฆฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ์ ์„ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ณ , ์–ธ์–ด๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง„์ž… ์žฅ๋ฒฝ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • ์ฝœ๋ฐฑ ์—†์ด ๋น„๋™๊ธฐ I/O๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ NodeJS์—์„œ ๊ฐ€๋” ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๋“ค(noodle)์€ ์—†์Šต๋‹ˆ๋‹ค.
  • NGINX์— ํ•„์š”ํ•œ ๋ชจ๋“ˆ๊ณผ ์ฝ”๋“œ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ๋ฐฐํฌ๊ฐ€ ์‰ฝ๊ณ , ๋ชจ๋“  ๊ฒƒ์ด ๋ฐ”๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ฐ˜์‘์ด ๋น ๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค.

๋ผ์šฐํŒ…์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ๋งค์šฐ ๊ธด ์ด์•ผ๊ธฐ๊ฐ€ ๋  ๊ฒ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋™์˜์ƒ ์žฌ์ƒ

๋ธ”๋ผ๋””๋ฏธ๋ฅด ํ”„๋กœํƒ€์†Œํ”„ โ€” OpenResty: NGINX๋ฅผ ์™„์ „ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „ํ™˜

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€