Nginx๋ ๋ฌด์์ธ๊ฐ?
์๋ก
ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์น ์๋ฒ๋ก Nginx๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋๋ฐ, ๋จ์ํ ์ฌ์ฉ๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๋ ๋ถํฐ ํ์คํ๊ฒ ์ก๊ณ ๊ฐ๊ธฐ ์ํด์ ์ ๋ฆฌ๋ฅผ ํ๊ฒ ๋์์ต๋๋ค. ์น ์๋ฒ์ ๋ํ ๊ฐ๋ ์ ์๋ ๊ฒ์๊ธ์์ ์ ๋ฆฌํ ์ ์ด ์์ผ๋ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ Nginx๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด์ ๋ ๋ค๋ฅธ ์น ์๋ฒ์ธ Apache์ ๋น๊ตํ๊ฒ ๋๋ ๋ ์๋ฐ์ ์๊ธฐ์, ์ด๋ฒ ๊ฒ์๊ธ์์๋ Nginx์ Apache์ ์ฑ๋ฅ์ ๋น๊ตํ๋ฉด์ Nginx์ ๋ํด ํ๋ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ฐจ๋ ์๋์ ๊ฐ์ต๋๋ค.
- Nginx๋?
- Nginx๊ฐ ๋ง๋ค์ด์ง ๋ฐฐ๊ฒฝ
- Nginx์ ๊ตฌ์กฐ
- Nginx์ ์ฅ๋จ์
- Apache์ Nginx์ ์ฑ๋ฅ ๊ฒฐ๊ณผ
- ์ ๋ฆฌ
Nginx๋?
Nginx๋ ํธ๋ํฝ์ด ๋ง์ ์น์ฌ์ดํธ์ ์๋ฒ(WAS)๋ฅผ ๋์์ฃผ๋ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ๊ตฌ์กฐ์ ๊ฒฝ๋ํ ์น ์๋ฒ ํ๋ก๊ทธ๋จ์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์์ ๋ ์์ฒญ์ ๋ง๋ ์ ์ ํ์ผ์ ์๋ตํด์ฃผ๋ HTTP Web Server๋ก ํ์ฉ๋๊ธฐ๋ ํ๊ณ , ๋๋ Reverse Proxy Server๋ก ํ์ฉํ์ฌ WAS์ ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ ๋ก๋๋ฐธ๋ฐ์ ์ญํ ์ ํ๊ธฐ๋ ํฉ๋๋ค.
Reverse Proxy์ ๋ก๋๋ฐธ๋ฐ์์ ๋ํ ๊ฐ๋ ์ ์๋ ๊ฒ์๊ธ์์ ์ ๋ฆฌํ์ต๋๋ค.
Nginx๊ฐ ๋ง๋ค์ด์ง ๋ฐฐ๊ฒฝ
์ต์ด์ ์น ์๋ฒ๋ 1995๋
UNIX ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง NCSA HTTPd์
๋๋ค(CERN httpd ์น ์๋ฒ๊ฐ ๋จผ์ ๋์์ต๋๋ค) .ํ์ง๋ง ์ด ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๊ฐ ๊ต์ฅํ ๋ง์์ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ ๋ ๋ถํธํจ์ ๋ง์ด ๋๊ผ์ต๋๋ค. ๊ทธ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ๊ฒ์ด ๋ฐ๋ก Apache Server์
๋๋ค. Apache ๊ฐ์ ๊ฒฝ์ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด connection์ ์์ฑํฉ๋๋ค. ๊ทธ๋์ ์๋ก์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ฌ ๋๋ง๋ค ์๋ก์ด process๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๋ PREFORK๋ผ๋ ๋ฐฉ์์ ์ด์ฉํ์ต๋ ๋ค. ๊ทธ๋์ ์๋ก์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ค๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ํ๋ก์ธ์ค๋ฅผ ํ ๋นํ์ต๋๋ค. ๋ง์ฝ ๋ง๋ค์ด๋์ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ์ถ๊ฐ๋ก ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ต๋๋ค.
์ด๋ฐ ๊ตฌ์กฐ ๋๋ถ์ ๊ฐ๋ฐ์๋ ๋ค์ํ ๋ชจ๋์ ๋ง๋ค์ด์ ์๋ฒ์ ๋น ๋ฅด๊ฒ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์์ต๋๋ค. ์ฆ, ํ์ฅ์ฑ์ด ๋์๊ณ , Apache Server๋ ๋์ ์ปจํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค. ํ์ฅ์ฑ์ด ์ข๋ค๋ ์ฅ์ ์ ๊ฒฐ๊ตญ ์์ฒญ์ ๋ฐ๊ณ ์๋ต์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ํ๋์ ์๋ฒ์์ ํด๊ฒฐํ๊ธฐ ์ข์์ต๋๋ค.
ํ์ง๋ง 1999๋ ์ ๋ค์ด์ค๋ฉด์ ์ปดํจํฐ๊ฐ ๋ง์ด ๋ณด๊ธ๋จ์ ๋ฐ๋ผ ์์ฒญ์ด ๋ง์์ ธ์ ์๋ฒ์ ๋์์ ์ฐ๊ฒฐ๋ connection์ด ๋ง์ ๋ ๋ ์ด์ ์๋ก์ด connection์ ์์ฑํ์ง ๋ชปํ๊ฒ ๋์์ต๋๋ค.
์ด๋ฅผ C10K(connection 10000 problem)๋ฌธ์ ๋ผ๊ณ ํ๋๋ฐ connection 10000๊ฐ์ ๋ฌธ์ ๋ผ๋ ๋ป ์ ๋๋ค. Apache Server๋ ๊ตฌ์กฐ์ ์ผ๋ก ์๋์ ๊ฐ์ ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ: connection์ด ์ฐ๊ฒฐ๋ ๋๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์์ฑ
- ๋ฌด๊ฑฐ์ด ํ๋ก๊ทธ๋จ: ํ์ฅ์ฑ์ด ์ข๋ค๋๊ฑด ๊ณง ๋ฆฌ์์ค๊ฐ ์๋ค๋ ๊ฑธ ์๋ฏธ
- CPU ๋ถํ ์ฆ๊ฐ: ๋ง์ connection ์์ฒญ์ด ๋ค์ด์ค๋ฉด context switching์ ๋ง์ด ํ๊ธฐ์ CPU ๋ถํ๊ฐ ์ฆ๊ฐ
์ฆ, Apache Server๋ ํ๋๋ก ์ฌ์๋ก ์ฌ์ฉํ๊ธฐ ๊บผ๋ ค์ก๊ณ , ์ด๋ฌํ ๊ตฌ์กฐ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ Nginx๊ฐ 2004๋ ์ ๋์์ต๋๋ค.
์ด์ฐฝ๊ธฐ Nginx๋ Apache์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ์น ์๋ฒ์ด๊ธฐ๋ ํ์ง๋ง ์ํ์น ์๋ฒ๋ฅผ ์์ ํ ๋์ฒดํ ๋ชฉ์ ์ ์๋์์ต๋๋ค. ์ํ์น ์๋ฒ๊ฐ ์ง๋ ๊ตฌ์กฐ์ ํ๊ณ๋ฅผ Nginx๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ทน๋ณตํ๋ ค๊ณ ํ์ต๋๋ค.
์ ์ด๋ฏธ์ง์ ๊ฐ์ด ์๋ง์ ๋์ connection์ Nginx๊ฐ ์ ์งํ๊ณ , Nginx๋ ์น ์๋ฒ์ด๊ธฐ์ ์ ์ ํ์ผ์ ๋ํ ์์ฒญ์ ์ค์ค๋ก ์ฒ๋ฆฌํ๊ณ , ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋์ ํ์ผ์ ์์ฒญ์ ๋ฐ์์ ๋๋ง ์ํ์น ์๋ฒ์ connection์ ํ์ฑํ์ฌ ์ํ์น ์๋ฒ์ ๋ถํ๋ฅผ ์ค์์ต๋๋ค.
3. Nginx์ ๊ตฌ์กฐ
๊ทธ๋ ๋ค๋ฉด Nginx๋ ์ด๋ ํ ๊ตฌ์กฐ๋ก ๋์ด์๊ธธ๋ ๊ทธ ๋ง์ ๋์ connection์ ์ ์งํ ์ ์์๊น์?
- Nginx๋ ์ค์ ํ์ผ์ ์ฝ๊ณ , ์ค์ ์ ๋ง๊ฒ worker process๋ฅผ ์์ฑํ๋ master process๊ฐ ์์ต๋๋ค.
- worker process๋ ์ค์ ๋ก ์ผ์ ํ๋ ํ๋ก์ธ์ค์ด๋ฉฐ worker process๊ฐ ๋ง๋ค์ด์ง ๋ ์ง์ ๋ listen ์์ผ์ ๋ฐฐ์ ๋ฐ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ผ์ ์๋ก์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด connection์ ํ์ฑํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
- connection์ ์ ํด์ง Keep-Alive ์๊ฐ๋งํผ ์ ์ง๋ฉ๋๋ค. ํ์ง๋ง connection์ด ํ์ฑ๋์๋ค๊ณ ํด์ worker process๊ฐ ํด๋น connection ํ๋๋ง ๋ด๋นํ์ง๋ ์์ต๋๋ค
- ํ์ฑ๋ connection์ผ๋ก๋ถํฐ ์๋ฌด๋ฐ ์์ฒญ์ด ์๋ค๋ฉด ์๋ก์ด connection์ ํ์ฑํ๊ฑฐ๋ ์ด๋ฏธ ๋ง๋ค์ด์ง ๋ค๋ฅธ connection์ผ๋ก๋ถํฐ ๋ค์ด์จ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
Nginx์์๋ ์ด๋ฌํ connection ํ์ฑ๊ณผ ์ ๊ฑฐ, ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด๋ฒคํธ(event)๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ด๋ฒคํธ๋ค์ os์ปค๋์ด queueํ์์ผ๋ก worker process์๊ฒ ์ ๋ฌํฉ๋๋ค. ์ด ์ด๋ฒคํธ๋ค์ queue์ ๋ด๊ธด ์ํ์์ ๋น๋๊ธฐ ์ํ๋ก ๋๊ธฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ worker process๋ ํ๋์ ์ค๋ ๋๋ก ์ด๋ฒคํธ๋ฅผ ๊บผ๋ด์ ์ฒ๋ฆฌํด ๋๊ฐ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ worker process๊ฐ ์ฌ์ง ์๊ณ ์ผ์ ํ๊ธฐ์, ์์ฒญ์ด ์์ ๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐฉ์น์ํค๋ Apache Server๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ผ๋ก ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด Apache ๋ฐฉ์์ธ ์ค๋ ๋ ๊ธฐ๋ฐ์ ํ๋์ ์ปค๋ฅ์ ๋น ํ๋์ ์ค๋ ๋๋ฅผ ์ก์๋จน์ง๋ง ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ connection์ ์ ๋ถ Event Handler๋ฅผ ํตํด ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด ๋จผ์ ์ฒ๋ฆฌ๋๋ ๊ฒ๋ถํฐ ๋ก์ง์ด ์งํ๋๊ฒ๋ ํฉ๋๋ค.
์ด๋ฌํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก Nginx์ ํต์ฌ์ ๋๋ค.
4. Nginx์ ์ฅ๋จ์
Nginx์ ๋จ์
- ๋์ ์ปจํ ์ธ ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌ ํ ์ โโ์์
- ๋์ ์ฝํ ์ธ ์ ๋ํ PHP ๋ฐ ๊ธฐํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค๋ฉด NGINX๊ฐ์ด๋ฅผ ์คํํ๊ธฐ ์ํด ์ธ๋ถ ํ๋ก์ธ์๋ก ์ ๋ฌํ๊ณ ๋ ๋๋ง ๋ ์ฝํ ์ธ ๊ฐ ๋ค์ ์ ์ก ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํจ(ํ๋ก์ธ์ค ์๋ ์ ํ).
- ์ฆ, ๋์ ์น ํ์ด์ง ์ปจํ ์ธ ๋ฅผ ๊ฐ์ง ๋ชจ๋ ์์ฒญ์ ์ํด ์ธ๋ถ ์์๊ณผ ์ฐ๊ณ(php-fpm)
Nginx์ ์ฅ์
- ์ด๋ฒคํธ ์ค์ฌ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์์ฒญ ์ ๊ณต
- ์ ํ๋ ํ๋์จ์ด ๋ฆฌ์์ค๋ก๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ
- ๋จ์ผ ์ค๋ ๋๋ฅผ ํตํด ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ต์ํ์ ๋ฆฌ์์ค๋ก ์น ์๋ฒ์ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ๋ฆฝํ HTTP ์๋ฒ๋ก ๋ฐฐ์น ๊ฐ๋ฅ
5. ์ฑ๋ฅ ๋น๊ต
์ ์ด๋ฏธ์ง๋ ๋์ connection ์ ๋น ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ ๋ํ๋ ๋๋ค. Apache Server์ ๋นํด Nginx๋ ๋์ connection ์๊ฐ ๋์ด๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ด ๋ฎ๊ณ ์ผ์ ํ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.
โ๋์ connection ์๊ฐ ๋ง์์ก์ ๋ ์ฒ๋ฆฌํ๋ ์ด๋น ์์ฒญ ์๋ Nginx๊ฐ Apache์ ๋นํด ์๋์ ์ผ๋ก ๋์ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค.
6. ์ ๋ฆฌ
Apache์ ํ๊ณ
ํด๋ผ์ด์ธํธ ์ ์๋ง๋ค Process ํน์ Thread ๋ฅผ ์์ฑํ๋ ๊ตฌ์กฐ์ ๋๋ค. 1๋ง ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋์์ ์ ์์ฒญ์ด ๋ค์ด์จ๋ค๋ฉด CPU ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ฆ๊ฐํ๊ณ ์ถ๊ฐ์ ์ธ Process/Tread ์์ฑ๋น์ฉ์ด ๋๋ ๋ฑ ๋์ฉ๋ ์์ฒญ์์ ํ๊ณ๋ฅผ ๋ณด์ ๋๋ค. ๋ํ, Apache ์๋ฒ์ ํ๋ก์ธ์ค๊ฐ blocking ๋ ๋ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ์ํ์ ์์ต๋๋ค. ์ด๋ Keep Alive(์ ์๋๊ธฐ) ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ์ง๋ง, ํจ์จ์ด ๋จ์ด์ง๋๋ค.
Nginx ์ ์ ๋ฆฌ
Nginx ๋ ์์์ ์ธ๊ธํ๋ฏ์ด Event-Driven ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ์ฆ, ํ๋ก๊ทธ๋จ ํ๋ฆ์ด ์ด๋ฒคํธ์ ์ํด ๊ฒฐ์ ์ด ๋ฉ๋๋ค. ํ ๊ฐ ๋๋ ๊ณ ์ ๋ ํ๋ก์ธ์ค๋ง ์์ฑํ๊ณ , ๊ทธ ๋ด๋ถ์์ ๋น๋๊ธฐ๋ก ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก task ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. Apache ์ ๋ฌ๋ฆฌ ๋์์ ์์ ์๊ฐ ๋ง์์ ธ๋ ์ถ๊ฐ์ ์ธ ์์ฑ๋น์ฉ์ด ๋ค์ง ์์ต๋๋ค.
- ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์์ฒญํ์ฌ ์ ์์์ ์ค๋ ๋๊ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ CPU์๋ชจ๊ฐ ์ ์ต๋๋ค.
- Apache ์ ๋ฌ๋ฆฌ CPU ์ ๊ด๊ณ์์ด I/O ๋ค์ ์ ๋ถ Event Listener๋ก ๋ฏธ๋ฃจ๊ธฐ ๋๋ฌธ์ ํ๋ฆ์ด ๋์ด์ง ์์ต๋๋ค.
- context switching ๋น์ฉ์ด ์ ์ต๋๋ค.