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
apche web server์์๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ connection์ ํ์ฑํ๋ค. ์ด๋ ์์ฑ๋ process๋ค์ cpu์ ๊ฐ ์ฝ์ด์ ํ ๋น๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ฝ์ด ํ๋์์ ์ฌ๋ฌ๊ฐ์ process๋ฅผ ์ฑ
์์ง๊ฒ ๋๋ค.
Nginx
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)
ํ๋ก์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์์นํ๋ฉฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์๋ฒ์ ๋์ ์ ๋ฌํ๋ค.
ํ๋ก์์ ์ฅ์
- ์ต๋ช ์ฑ ๋ณด์ฅ: ํด๋ผ์ด์ธํธ์ ์ค์ IP ์ฃผ์๋ฅผ ์จ๊ธฐ๊ณ ํ๋ก์ ์๋ฒ์ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธํฐ๋ท์ ํ์
- ์ฝํ ์ธ ํํฐ๋ง: ์น ํธ๋ํฝ์ ๋ชจ๋ํฐ๋งํ๊ณ ํน์ ์ฌ์ดํธ๋ ์ฝํ ์ธ ์ ๋ํ ์ ๊ทผ์ ์ฐจ๋จ
- ์บ์ฑ: ์์ฃผ ์์ฒญ๋๋ ์ฝํ ์ธ ๋ฅผ ํ๋ก์ ์๋ฒ์ ์ ์ฅํด๋ ๋ค, ์๋ฒ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ์ฃผ์ด ์ฑ๋ฅ์ ํฅ์
๋ฆฌ๋ฒ์ค ํ๋ก์ (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.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;
}
}