Post

Nginx์™€ reverse proxy

๐Ÿค”๋ฐœํ‘œ ์ฃผ์ œ์„ ์ •

๊ตฐ๋Œ€ ๊ฐœ๋ฐœ ๋ฐœํ‘œ ์†Œ๋ชจ์ž„ Vivache์˜ ์ฒซ๋ฒˆ์งธ ๋ฐœํ‘œ๋กœ ๋‚ด์šฉ์„ ์ฐพ๋˜ ๋„์ค‘, ์ž๋Œ€์— ์ฒ˜์Œ ์™€์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ถ•ํ–ˆ๋˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…์ด ๋– ์˜ฌ๋ž๋‹ค. ์ž๋Œ€์— ์ฒ˜์Œ ์™”์„ ๋‹น์‹œ, ์‚ฌ์ง€๋ฐฉ์—์„œ ์›ํ•˜๋Š” ํผํฌ๋จผ์Šค๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ๋ถˆํŽธ์‚ฌํ•ญ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋„ ์ž์œ ๋กญ์ง€ ๋ชปํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ € ์ ‘์†๋„ http/https์ด์™ธ์˜ ํ”„๋กœํ† ์ฝœ์ด ์ œํ•œ๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง‘์— NAS ์„œ๋ฒ„๋ฅผ ๋“ค์ด๊ณ , ํ™ˆ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์•„ํŒŒ์น˜ ๊ณผ์นด๋ชฐ๋ฆฌ๋ผ๋Š” ์‹œ์Šคํ…œ์œผ๋กœ ์ง‘์— ์žˆ๋Š” pc์— ์›๊ฒฉ์ ‘์†์„ ์‹œ๋„ํ–ˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ฐ–์ถœ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋•Œ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ , ํŠนํžˆ ip, DNS, DDNS, Reverse Proxy๊ฐ™์€ ๊ฐœ๋…์„ ์Šต๋“ํ–ˆ์—ˆ๋Š”๋ฐ, ๋Œ€๋žต 6๊ฐœ์›” ์ •๋„๊ฐ€ ์ง€๋‚œ ์ง€๊ธˆ, ๊ทธ ๋‹น์‹œ์— ์ตํžŒ ์ง€์‹๋“ค์„ ์ •๋ฆฌ, ๋ณด์™„ํ•˜์—ฌ ๋ฐœํ‘œ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ““1.1. Apache web server

1998๋…„ ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด apache web server๋ผ๋Š” ํˆด์ด ๊ณต๊ฐœ๋˜์—ˆ๋‹ค. apache web server๋Š” โ€˜๋ชจ๋“ˆโ€™์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ ์šฉํ•˜์—ฌ ํƒ€์‚ฌ์˜ DBMS, ์—ฌ๋Ÿฌ ํ”„๋กœํ† ์ฝœ ๋“ฑ์„ ํˆด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค. ์ด๋Š” ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ๋„“ํ˜€์ฃผ์—ˆ๊ณ , apache web server์˜ ์‚ฌ์šฉ์ž๋Š” ์ ์  ๋Š˜์–ด๋‚ฌ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ 2000๋…„๋Œ€๋ฅผ ์ง€๋‚˜๋ฉด์„œ ์„œ์„œํžˆ ์ผ๋ฐ˜ ๊ฐ€์ •์—๋„ ์ปดํ“จํ„ฐ์™€ ํœด๋Œ€์ „ํ™”๊ฐ€ ๋ณด๊ธ‰๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ apache web server์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. apache web server๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ 1๋Œ€1๋กœ connect๋ฅผ ๋งบ๊ณ  ์‘๋‹ต์„ ์ฃผ๊ณ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— client์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ๊ทธ๋Œ€๋กœ ์„œ๋ฒ„์ชฝ์˜ ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ ˆ๋Œ€์ ์ธ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ ์  ๊ฑฐ๋ก ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ด๋Š” 1๋งŒ๊ฐœ์˜ connection์„ ์ฒ˜๋ฆฌํ•ด๋‚ผ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์˜ C10K(connection 10000 problem) ๋ฌธ์ œ๋กœ ๋‚จ์•˜๋‹ค.

๐Ÿ““1.2. Nginx์˜ ๋“ฑ์žฅ

2004๋…„, apache web server์˜ C10K๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ•œ์œผ๋กœ Nginx๋ผ๋Š” ํˆด์ด ๋“ฑ์žฅํ–ˆ๋‹ค. Nginx๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ apache web server์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๊ณ  apache web server๋กœ ๊ฐ€์•ผ ํ•  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ Nginx์—์„œ 1์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฆ‰ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ Nginx๊ฐ€ ๋จผ์ € ๋ฐ›์•„ ์ •์  ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ, ์บ์‹œ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ๋“ฑ์˜ ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ๋™์  ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋ณต์žกํ•œ ์—…๋ฌด๋งŒ apache web server์— ์š”์ฒญํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค.

๐Ÿ““1.3. Apache web server ์™€ Nginx์˜ ์ž‘๋™ ๋ฐฉ์‹

apache web server์—๋Š” 10,000๊ฐœ ์ƒ๋‹น์˜ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๋Š” C10K๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Nginx์—๋„ 10,000๊ฐœ ์ƒ๋‹น์˜ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์„๊นŒ? 2000๋…„๋Œ€ ์ดˆ๋ฐ˜์— ๋น„ํ•ด ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๋Š” ์ˆ˜์‹ญ ์ˆ˜๋ฐฑ๋ฐฐ ์ฆ๊ฐ€ํ–ˆ์„ํ…๋ฐ, ์–ด๋–ป๊ฒŒ Nginx๋Š” ์•„์ง๊นŒ์ง€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ ๋‹ต์€ Nginx์™€ apache web server์˜ ๊ทผ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์˜ ์ฐจ์ด์— ์žˆ๋‹ค.

Apache web server

apache_work_flow apche web server์—์„œ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— connection์„ ํ˜•์„ฑํ•œ๋‹ค. ์ด๋•Œ ์ƒ์„ฑ๋œ process๋“ค์€ cpu์˜ ๊ฐ ์ฝ”์–ด์— ํ• ๋‹น๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”์–ด ํ•˜๋‚˜์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ process๋ฅผ ์ฑ…์ž„์ง€๊ฒŒ ๋œ๋‹ค.

Nginx

nginx_work_flow nginx๋Š” master process์™€ worker process๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. master process๋Š” worker process๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ cpu์˜ ๊ฐ core๋‹น ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ worker process๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๊ฐ worker process๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ˆ˜์˜ ํ…Œ์Šคํฌ๋ฅผ ํ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

nginx์˜ ๋™์ž‘ ๊ตฌ์กฐ์ƒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด๋“์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • cpu์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž‘์—… ์˜์—ญ์— ์˜ฌ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ (context switch) ์ด๋Ÿฌํ•œ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์˜ ์ˆ˜์— ๋น„๋ก€ํ•ด ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ด ์ฆ๊ฐ€ํ•˜๋Š” apache web server์— ๋น„ํ•ด nginx๋Š” ์‹คํ–‰๋˜๋Š” worker process์˜ ์ˆ˜๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ๋น„๊ต์  ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค.

์ด์™ธ์—๋„ nginx์—์„œ๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ๊ฐœ๋…์ด ์ ์šฉ๋˜์–ด์žˆ๋‹ค.

I/O Non-Blocking : ๋น„๊ต์  ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์†Œ์š”๋˜๋Š” ๋„คํŠธ์›Œํฌ I/O ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ, worker process๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹

์“ฐ๋ ˆ๋“œ ํ’€(Nginx 1.7.11๋ถ€ํ„ฐ ์ ์šฉ) : ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ํŠน์ˆ˜ํ•œ ์ž‘์—…๋“ค์„ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ ํ’€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

๐Ÿ““2. ํ”„๋ก์‹œ, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ

ํ”„๋ก์‹œ (Proxy)

proxy

ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์œ„์น˜ํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋Œ€์‹  ์ „๋‹ฌํ•œ๋‹ค.

ํ”„๋ก์‹œ์˜ ์žฅ์ 

  • ์ต๋ช…์„ฑ ๋ณด์žฅ: ํด๋ผ์ด์–ธํŠธ์˜ ์‹ค์ œ IP ์ฃผ์†Œ๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท์„ ํƒ์ƒ‰
  • ์ฝ˜ํ…์ธ  ํ•„ํ„ฐ๋ง: ์›น ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํŠน์ • ์‚ฌ์ดํŠธ๋‚˜ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จ
  • ์บ์‹ฑ: ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„์— ์ €์žฅํ•ด๋‘” ๋’ค, ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ์ฃผ์–ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ

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

reverse_proxy

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์— ์œ„์น˜ํ•˜๋ฉฐ, ์ฃผ๋กœ ์„œ๋ฒ„ ์ธก์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์˜ ์žฅ์ 

  • ๋ณด์•ˆ ๊ฐ•ํ™”: ์›๋ณธ ์„œ๋ฒ„์˜ ์‹ค์ œ IP ์ฃผ์†Œ๋ฅผ ์ˆจ๊ธฐ๊ณ , ์™ธ๋ถ€ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ
  • ๋ถ€ํ•˜ ๋ถ„์‚ฐ: ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐ์‹œ์ผœ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์„œ๋น„์Šค์˜ ๊ฐ€์šฉ์„ฑ์„ ํ–ฅ์ƒ
  • ์บ์‹ฑ ๋ฐ ์••์ถ•: ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„์— ์ €์žฅํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜์—ฌ ์ „์†ก ํšจ์œจ์„ ๋†’์ž„
  • SSL ์•”ํ˜ธํ™”: ํด๋ผ์ด์–ธํŠธ์™€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”

๐Ÿ’ป๊ตฌํ˜„

๊ทธ๋ ‡๋‹ค๋ฉด nginx์—์„œ reverse proxy๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

1. nginx ์„ค์น˜ (ubuntu ๊ธฐ์ค€)

$ sudo apt install nginx

2. nginx ์‹คํ–‰

  • nginx ์‹คํ–‰ $ sudo systemctl start nginx

  • ์‹œ์Šคํ…œ ์žฌ๋ถ€ํŒ…์‹œ nginx ์ž๋™์‹คํ–‰ $ sudo systemctl enable nginx

3. nginx ํŒŒ์ผ ๊ตฌ์„ฑ ์‚ดํŽด๋ณด๊ธฐ

nginx_file

nginx_file2

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ/ํด๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. nginx.conf : nginx์˜ ๋ฉ”์ธ configํŒŒ์ผ. sites-enabled๋‚ด์˜ ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜์—ฌ ๋กœ๋“œํ•œ๋‹ค. sites enabled : sites available์— ๋งŒ๋“  configํŒŒ์ผ ์ค‘ ํ™œ์„ฑํ™”ํ•  ํŒŒ์ผ๋“ค์„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•ด์˜จ๋‹ค. sites available : nginx์˜ ์„œ๋ธŒ configํŒŒ์ผ์„ ์ €์žฅํ•ด๋‘” ๋””๋ ‰ํ† ๋ฆฌ. ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ.

4. nginx.conf ํŒŒ์ผ ์ˆ˜์ •

์šฐ์„  ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

1
2
3
4
5
6
7
8
9
server{
	listen 8888;
	server_name localhost;

	location /post {
		alias /home/smpringles;
		index main.html;
	}
}

localhost์˜ 8888๋ฒˆ ํฌํŠธ โ€˜/postโ€™ ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘์†์„ ํ•˜๋ฉด -> ์„œ๋ฒ„์ธก pc์˜ /home/smpringles/main.html ํŒŒ์ผ์„ ๋ณด์—ฌ์ค€๋‹ค.

๊ทธ ํ›„, ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“  ๋’ค, proxy_pass๋กœ ์š”์ฒญ์„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ํ•ด์ค€๋‹ค.

1
2
3
4
5
6
7
8
server{
	listen 9999;
	server_name localhost;

	location / {
		proxy_pass http://localhost:8888;
	}
}
This post is licensed under CC BY 4.0 by the author.