๐ webserv: ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฒ ์ํคํ ์ฒ์ ๊ตฌํ - HTTP/1.1์ ์ฌ๊ตฌ์ฑ
Inception์ด Docker๋ฅผ ํตํด ์ฌ๋ฌ ์๋น์ค๋ฅผ ์กฐ๋ฆฝํ๋ โ์ธํ๋ผ ์ํคํ
ํธโ์ ๊ด์ ์ ์ ๊ณตํ๋ค๋ฉด, webserv๋ ๊ทธ ์ธํ๋ผ์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ตฌ์ฑ ์์์ธ ์น ์๋ฒ์ ๋ด๋ถ๋ฅผ C++98๋ง์ผ๋ก ์ง์ ์ค๊ณํ๊ณ ๊ตฌํํ๋ โ์์คํ
์ํคํ
ํธโ์ ์ญํ ์ ์๊ตฌํ๋ ๊ณผ์ ์ด๋ค.
์ด ํ๋ก์ ํธ๋ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ๋์ด์, ํ๋ ๊ณ ์ฑ๋ฅ ์น ์๋ฒ(NGINX ๋ฑ)๊ฐ ์ฑํํ๊ณ ์๋ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ(Asynchronous Event-driven) ์ํคํ ์ฒ๋ฅผ ์ง์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
webserv๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์ถ๋ฐํ HTTP ์์ฒญ์ด๋ผ๋ ์์ํ ํ
์คํธ๊ฐ ์ด๋ป๊ฒ ์๋ฒ์ ๋ฌธ์ ํต๊ณผํ๊ณ , ๋ด๋ถ ๋ก์ง์ ๊ฑฐ์ณ ์๋ฏธ ์๋ ์๋ต์ผ๋ก ๋ณํ๋์ด ๋์๊ฐ๋์ง, ๊ทธ ๋ณด์ด์ง ์๋ ํต์ ์ ์ ๊ณผ์ ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์ฌ๊ตฌ์ฑํ๊ณ ๊ทธ ์ดํด๋๋ฅผ ๋ํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ค.
ํนํ๋ ๋ง์ง๋ง ๊ณผ์ ์ ๋๋ถ์ด ์ต์ 3์ธ, ์ต๋ 5๋ช ์ด ํจ๊ปํ๋ ํ๋ก์ ํธ์ธ ๋งํผ, ๊ฐ์ฅ ๋์ด๋๊ฐ ์์ผ๋ฉฐ, ์ผ๋ง๋ ์ฒด๊ณ์ ์ธ ๊ณํ์ ์ธ์ธ์ค ์๊ณ ํ์ ํ ํ๋๊ฐ ์๋์ง์ ๋ฐ๋ผ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ์์ค๊ณผ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๊ฐ๋ฆฌ๋ ๊ทธ๋ฐ ํ๋ก์ ํธ๋ผ ํ ์ ์๊ฒ ๋ค.
๐ 1. ์ํคํ ์ฒ ์ค๊ณ: C10K ๋ฌธ์ ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ ๊ทผ๋ฒ
์ ํต์ ์ธ โ์์ฒญ ๋น ์ค๋ ๋/ํ๋ก์ธ์ค ์์ฑโ ๋ชจ๋ธ, ์ด๋ฅผ ๊ธฐ๋ฐํ ์๋ฒ ํ๋ก๊ทธ๋จ๋ค์ ์์ฒ, ์๋ง ๊ฐ์ ๋์ ์ ์(C10K Problem)์ ์ฒ๋ฆฌํ๊ธฐ์ ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก๋ฉด์์ ํ๊ณ๊ฐ ๋ช ํํ๋ค๊ณ ์๋ ค์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ํฉ์ ๋๋๊ฒ ํด๊ฒฐํ๊ณ , ํ์ฌ๋ ํ๋ก์, ํน์ ์ ์ ๋ฐฐํฌ๋ฅผ ์ํด ์์ฃผ ๊ธฐ์ด์ ์ผ๋ก ํ์ฉ๋ ์ ๋๋ก ๋์คํ๋ ์ผ์ด์ค๊ฐ ๋ฐ๋ก Nginx๋ค.
๊ทธ๋ฌํ Nginx ๋ ๋จ์ผ ์ค๋ ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. ๋ฌผ๋ก ํ์ฌ์ ๊ทธ๊ฒ์ ๊ทธ๋ผ์๋ โ์์ฒญ ๋น ์ค๋ ๋/ํ๋ก์ธ์ค ์์ฑโ์ ์ด์ ์ ํก์ํ์ฌ ๋ณด๋ค ์ฌ์ธํ ํ๋ก๊ทธ๋จํ ๋์์ผ๋, ๊ทธ ๊ธฐ๋ณธ ์ฒ ํ์ ์ฌ์ ํ๊ณ , webserv๋ ์ด ์ฒ ํ์ Non-blocking I/O + I/O ๋ฉํฐํ๋ ์ฑ์ด๋ ๊ฐ๋
์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ๋ชจ๋ธ๋ก ๋ชจ์ฌํด๋ธ๋ค.
์ด ์ํคํ ์ฒ๋ ๋จ์ผ (๋๋ ์์์) ์ค๋ ๋๋ง์ผ๋ก ์๋ง์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, I/O ์์ ์ด ์งํ๋๋ ๋์ CPU๋ฅผ ๋ค๋ฅธ ์์ ์ ํ ๋นํ์ฌ ์์คํ ์์์ ๊ทน๋ํํ๋ค. ์๋ฒ์ ๋ชจ๋ ๋์์ ์์คํ ์ปค๋์์ ์ ๊ณตํด์ฃผ๋ โ์ด๋ฒคํธโ๊ฐ ๋ฐ์ํ์ ๋์ ์๊ทธ๋์ ๋ง์ถ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
๐ ๏ธ 2. ํต์ฌ ๊ตฌํ ์์: ์์คํ ์ฝ๊ณผ ํ๋กํ ์ฝ์ ์กฐ๋ฆฝ
๊ฐ. ์์ผ ํ๋ก๊ทธ๋๋ฐ: ํต์ ์ ๊ด๋ฌธ
์์ผ์ ์ด์์ฒด์ ์ TCP/IP ์คํ์ ์ ์ดํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค(API)์ด๋ค. ์๋ฒ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ค์ ์์คํ ์ฝ๋ค์ ํตํด ๊ด๋ฆฌ๋๋ค.
socket(): ํต์ ์ ์ํ ์๋ํฌ์ธํธ๋ฅผ ์์ฑํ๋ค.fcntl(): ์์ฑ๋ ์์ผ์ Non-blocking ๋ชจ๋๋ก ์ค์ ํ๋ค. ์ด๋accept(),read(),write()๋ฑ์ I/O ํจ์๊ฐ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์ง ์์์ ๋ ์ฆ์ ๋ฐํ๋๋๋ก ํ์ฌ, ์ด๋ฒคํธ ๋ฃจํ ์ ์ฒด๊ฐ ๋ฉ์ถ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ํต์ฌ์ ์ธ ๋จ๊ณ์ด๋ค.setsockopt():SO_REUSEADDR์ต์ ์ ํตํด ์๋ฒ๊ฐ ๋น์ ์ ์ข ๋ฃ๋ ํ ์ฆ์ ์ฌ์์ํด๋ ๋์ผํ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ์ค์ ํ๋ค.bind(): ์์ผ์ ํน์ IP ์ฃผ์์ ํฌํธ ๋ฒํธ๋ฅผ ํ ๋นํ๋ค.listen(): ์์ผ์ด ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ์ ์์ ๋๊ธฐํ๋๋ก ์ค์ ํ๋ค.accept(): ์ฐ๊ฒฐ ์์ฒญ ํ์์ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ๊ฐ์ ธ์, ํต์ ์ ์ํ ์๋ก์ด ์์ผ(์ปค๋ฅ์ ์์ผ)์ ์์ฑํ๋ค.
๋. I/O ๋ฉํฐํ๋ ์ฑ (kqueue): ์ด๋ฒคํธ ๋ฃจํ์ ์ฌ์ฅ
๋ณธ๋ I/O ๋ฉํฐํ๋์ฑ์ ์ํ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ select ์ poll ์ ํ์ฉํ๋ ๋ฐฉ์์ POSIX ํ์ค ๋ชจ๋ธ์ด ์๋ค. ํนํ poll์ ๊ตฌํ์ ์๊ฐ๋ณด๋ค ๋ณต์กํ์ง ์์ผ๋ฉฐ, ์คํ๋ ค ์ง๊ด์ ์ธ๋ฐ, ๊ฐ์ ๋์์ ๋ฐฐ์ด๋ก ๋ง๋ค๊ณ , ์ด ๋ฐฐ์ด์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ค์บํ์ฌ ์ธก์ ํ๋ ๊ตฌ์กฐ์ด๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ ์ ํ์ ๊ตฌ์กฐ์ด๋ฏ๋ก, O(N) ์ ์๊ฐ ๋ณต์ก๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ , ์ด์์ฑ์ ์ข๊ณ , ๋ฌด์๋ณด๋ค ์ง๊ด์ ์ฅ์ ์ ๊ฐ์ง๋, ํ์ฌ๋ ๊ณ ์๋ฅ ์๋ฒ์์ ์ฐ์ด์ง ์๋๋ค. ์ดํ ๋ฆฌ๋
์ค ์ปค๋ 2.5.44 ๋ฒ์ ์ดํ๋ถํฐ๋ epoll ์ด๋ผ๋ ๊ฑฐ์ ํ์คํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ณ , Linux 5.1 ์ปค๋์์ ๋์
๋ ๊ฐ์ฅ ๊ณ ์ฑ๋ฅ ๋น๋๊ธฐ I/O ์ธํฐํ์ด์ค๋ io_uring ์ด ์กด์ฌํ๋ค.
์ด๋ฌํ ๋ฆฌ๋
์ค ์ปค๋์ ๋ฐ๋ฅธ ๋ฒ์ ๊ณผ ์ ์ฌํ๊ฒ FreeBSD ๊ณ์ด OS์์ epoll๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก kqueue ์ด๋ค. ์ฐธ๊ณ ๋ก FreeBSD ๊ธฐ๋ฐ์ OS ์ ์ฌ์ฉ์ ๋งค์ฐ ํํ ์ผ์ ์๋๊ธฐ์ ์ต์ํ์ง ์์ ์ ์์ผ๋, ์์ค ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ๋, ์์ค ๊ณต๊ฐ๋ฅผ ํ์ง ์์๋ ๋๋ ๋ผ์ด์ผ์ค ๋๋ถ์ ๊ธฐ์
์ฉ OS ํ๋ซํผ์ FreeBSD๊ฐ ๋ง์ด ์ฐ์ธ๋ค๊ณ ํ๋ค(Mac OS, iOS, Sony PS ๊ณ์ด, Nintendo์ Switch OS ๋ฑโฆ)
kqueue๋ ์์์ ์ค๋ ๋๋ก ๋ค์์ I/O ์ด๋ฒคํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ BSD ๊ณ์ด ์ด์์ฒด์ ์ ๊ณ ์ฑ๋ฅ API์ด๋ค. ํน์ง์ ๊ทธ๋๋ ๋ค์ ์์ฝํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋์ ์๋ฆฌ: ์๋ฒ๋
kqueue()๋ก ์ปค๋์ ์๋ก์ด ์ด๋ฒคํธ ํ๋ฅผ ์์ฑํ๋ค. ์ดํkevent()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ํ๊ณ ์ ํ๋ ์ด๋ฒคํธ(์: โ์๋ฒ ์์ผ์ ์๋ก์ด ์ฐ๊ฒฐ ์์ฒญ์ด ๋์ฐฉํจโ, โ์ปค๋ฅ์ ์์ผ์์ ์ฝ์ ๋ฐ์ดํฐ๊ฐ ์์โ)๋ฅผ ํ์ ๋ฑ๋ก(Register)ํ๋ค. - ์ด๋ฒคํธ ๋ฃจํ: ์๋ฒ์ ๋ฉ์ธ ๋ก์ง์ ๋ฌดํ ๋ฃจํ ๋ด์์
kevent()๋ฅผ ํธ์ถํ์ฌ ๋๊ธฐํ๋ ๊ฒ์ด๋ค.kevent()๋ ๋ฑ๋ก๋ ์ด๋ฒคํธ ์ค ํ๋๋ผ๋ ๋ฐ์ํ ๋๊น์ง ํ๋ก์ธ์ค๋ฅผ ๋๊ธฐ์ํค๋ฉฐ, ์ด๋ฒคํธ ๋ฐ์ ์ ๋ฐ์ํ ์ด๋ฒคํธ ๋ชฉ๋ก์ ๋ฐํํ๋ค. ๋ฃจํ๋ ๋ฐํ๋ ์ด๋ฒคํธ๋ค์ ์ํํ๋ฉฐ ๊ฐ๊ฐ์ ๋ง๋ ํธ๋ค๋ฌ(์ ์ฐ๊ฒฐ ์๋ฝ, ๋ฐ์ดํฐ ์์ ๋ฑ)๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌํ๋ค. ์ด ๊ตฌ์กฐ ๋๋ถ์ ์๋ฒ๋ ์ค์ ์์ ์ด ํ์ํ ๋๋ง ๊นจ์ด๋ ๋์ํ๊ฒ ๋๋ค. - ๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ: ๊ฐ์ํด์ผํ ๋์์ด ๋์ด๋๋, ์ฑ๋ฅ ์ ํ๋ ๊ฑฐ์ ์๋ค.
- ๋ค์ํ ์ด๋ฒคํธ ํตํฉ ๊ด๋ฆฌ: ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ํ๋ฅญํ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ผ๋ก ๋จ์ ์์ผ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ฐ๋ฅ ์ํ ๋ฟ ์๋๋ผ ์๊ทธ๋, ํ์ผ ๋ณ๊ฒฝ ์ฌ๋ถ, ํ๋ก์ธ์ค ์ํ ๋ณํ๋ ํ์ด๋จธ ๋ฑ ๋ค์ํ ์์คํ ๋ ๋ฒจ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋, ๊ฐ์ง ๊ฐ๋ฅํ๊ณ ์ด๋ฅผ ๋จ์ผ ์ธํฐํ์ด์ค์์ ํตํฉ๊ด๋ฆฌ๊ฐ ๋๋ค๋ ์ ์ ๋งค์ฐ ์ ์๋ฏธํ๋ค.
๋ค. ์ค์ ํ์ผ ํ์: ์ ์ฐ์ฑ๊ณผ ๊ฐ์ ํธ์คํ
nginx.conf์ ์ ์ฌํ ํ์์ ์ค์ ํ์ผ์ ํด์ํ๋ ํ์๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ์ด ํ์๋ ์๋ฒ์ ๋์์ ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์ ์ดํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
- ํต์ฌ ๊ธฐ๋ฅ: ํฌํธ ๋ฐ์ธ๋ฉ, ์๋ฒ ์ด๋ฆ ์ง์ , ๊ธฐ๋ณธ ์๋ฌ ํ์ด์ง ๊ฒฝ๋ก, ํ์ฉ HTTP ๋ฉ์๋,
location๋ธ๋ก๋ณ ๋ผ์ฐํ ๊ท์น(๋ฃจํธ ๋๋ ํ ๋ฆฌ, CGI ์ค์ ๋ฑ)์ ํ์ฑํ์ฌ C++ ๊ฐ์ฒด(์:ServerConfig)๋ก ๊ตฌ์กฐํํ๋ค. - ๊ฐ์ ํธ์คํ
(Virtual Hosting): ํ์ฑ๋ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก, ์๋ฒ๋ HTTP ์์ฒญ ํค๋์
Hostํ๋๋ฅผ ํ์ธํ์ฌ ๋์ผํ IP์ ํฌํธ๋ก ๋ค์ด์จ ์์ฒญ์ด๋ผ๋ ๊ฐ๊ฐ ๋ค๋ฅธserver๋ธ๋ก ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ์น์ฌ์ดํธ๋ฅผ ์๋นํ ์ ์์ด์ผ ํ๋ค. ์ด๋ ๋ด๋ถ์ ์ผ๋ก ์ถ์ํ ๋ ๋ฟ ์ค์ง ๋จ์ผ ์ฒ๋ฆฌ๊ธด ํ๋ค.
๋ผ. HTTP/1.1 ํ๋กํ ์ฝ ํ์ ๋ฐ ์๋ต ์์ฑ๊ธฐ
- ์์ฒญ(Request) ํ์ฑ: ํด๋ผ์ด์ธํธ ์์ผ์ผ๋ก๋ถํฐ ์ฝ์ด๋ค์ธ ์์ํ ๋ฐ์ดํธ ์คํธ๋ฆผ์ HTTP/1.1 ๋ช
์ธ์ ๋ฐ๋ผ ํ์ฑํ๋ค. REST ์์น์ ๋ฐ๋ผ HTTP/1.1 ์ ๊ฐ๋
๋ค์ ๋ถ์ํ์ฌ ํ์๋ฅผ ๊ตฌ์ถํ๋ค. ์ฒซ ์ค์ธ
Start-Line์์Method(GET, POST, DELETE),Request-URI,HTTP-Version์ ์ถ์ถํ๊ณ , ์ดํ ๋น ์ค(\r\n\r\n)์ด ๋์ฌ ๋๊น์ง ํค๋๋ค์ ํ์ฑํ์ฌmap๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ๋ค.Content-Length๊ฐ ๋ช ์๋ POST ์์ฒญ์ ๊ฒฝ์ฐ, ๋ช ์๋ ๊ธธ์ด๋งํผ์Body๋ฐ์ดํฐ๋ฅผ ์์ ํด์ผ ํ๋ค. - ์๋ต(Response) ์์ฑ: ํ์ฑ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ํ, ์๋ฒ๋ ๋ค์ ๋ช
์ธ์ ๋ง์ถฐ ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
Status-Line(HTTP/1.1 200 OK),Headers(Content-Type,Content-Length๋ฑ), ๊ทธ๋ฆฌ๊ณBody(HTML ํ์ผ ๋ด์ฉ ๋ฑ)๋ฅผ ์กฐํฉํ์ฌ ํด๋ผ์ด์ธํธ ์์ผ์ ์ ์กํ๋ค. - ๋ถ์ฐจ ์ ์ธ ์์๋ค: chunk ๋จ์๋ก ๋ค์ด๋ก๋๊ฐ ํ์ํ ์ผ์ด์ค ๋ฑ์ ๊ณ ๋ คํ์ฌ, ํฐ ๋ฐ์ดํฐ๋ค์ด ๋ค์ด์ฌ ๋๋ ์ด์ ๋ง์ถฐ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ , ์ด๋ฅผ ํฉ์ณ์ ์ ๊ณตํ๊ฑฐ๋ ์์ ํ๋ ๋ฑ์ HTTP /1.1 ๊ธฐ์ค์ ๋ง์ถ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํด์ผํ๋ค.
๋ง. CGI (Common Gateway Interface): ๋์ ์ฝํ ์ธ ์์ฑ
CGI๋ ์น ์๋ฒ๊ฐ ์ธ๋ถ ์คํฌ๋ฆฝํธ(Python, PHP ๋ฑ)๋ฅผ ์คํ์์ผ ๋์ ์ธ ์ฝํ ์ธ ๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์ค ํ๋กํ ์ฝ์ด๋ค. ํ์์ ๋๋ ์ด์ ๋ ์น ์๋ฒ๊ฐ ์ํํ๊ธฐ์๋ ์ฐ์ฐ ์ง์ฝ์ ์ด๊ฑฐ๋, ํน์ํ ๋ชฉ์ ์ฑ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ ์ ๊ท ํ๋ก์ธ์ค๋ก ๊ตฌํํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ๋ฌผ๋ก , ํ์ฌ๋ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ฉฐ, CGI ๋ผ๋ ๊ธฐ์ค์ผ๋ก ๊ตฌํ ๋ฐฉ์์ โ์ฌ๋โ ํ๊ณ โ๋ฌด๊ฒ๋คโ ๊ณ ์ด์ผ๊ธฐ ๋๊ธฐ๋ ํ๋ค.
- ๊ตฌํ:
fork()๋ก ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ํ,pipe()๋ก ๋ถ๋ชจ-์์ ๊ฐ ํต์ ์ฑ๋์ ๋ง๋ ๋ค. ๋ถ๋ชจ ํ๋ก์ธ์ค(์๋ฒ)๋ HTTP ์์ฒญ ์ ๋ณด๋ฅผ ํ๊ฒฝ ๋ณ์(REQUEST_METHOD,QUERY_STRING๋ฑ)๋ก ์ค์ ํ๊ณ , POST ์์ฒญ์ ๊ฒฝ์ฐBody๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ก์ธ์ค์stdin์ผ๋ก ํ์ดํ๋ฅผ ํตํด ์ ๋ฌํ๋ค. ์์ ํ๋ก์ธ์ค๋dup2()๋ก ์์ ์ ํ์ค ์ ์ถ๋ ฅ์ ํ์ดํ์ ์ฐ๊ฒฐํ ๋ค,execve()๋ก CGI ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ค. ์คํฌ๋ฆฝํธ์ ์คํ ๊ฒฐ๊ณผ(ํ์ค ์ถ๋ ฅ)๋ ๋ค์ ํ์ดํ๋ฅผ ํตํด ๋ถ๋ชจ ํ๋ก์ธ์ค๋ก ์ ๋ฌ๋์ด, ์ต์ข HTTP ์๋ต์Body๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋๋ค.
๋ฐ. ํ์ ๋๊ตฌ๋ค ๋ฐ ์ ๋ต
ํด๋น ๊ณผ์ ์์๋ ๊ฐ์ฅ ์ด๋ ค์ ๋ ์์ญ์ด ๋ฐ๋ก, ์๋ก์ kqueue ์ ๋ํ ์ดํด๋๊ฐ ๋ค๋ฅด๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฐ ์ํ์์ ์๋ฌ ํธ๋ค๋ง์ ์ด๋ป๊ฒ ํด์ผํ ์ง ์ฝ๊ฒ ์ ๊ทผํ๊ธฐ ์ด๋ ค์ ๋ค๋ ์ ์ด๋ค. ์ค๊ณ๋ฅผ ํ๋๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ ํํ๊ธฐ ์ธ์งํ์ง ๋ชปํ๊ณ , ํนํ๋ ์ํต ๋ฌธ์ ๋ฅผ ํฌํจํ์ฌ ์ฌ๋ฌ ์ด์๋ค์ด ์๊ฒจ๋ฌ๋ค.
์ด๋ฌํ ์ ์ ๊ณ ๋ คํ์ง ๋ชปํ 1์ฐจ ๊ฐ๋ฐ ํ์ ์๋นํ ๊ณค๋, ์ด๋ ค์์ ์์๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์คํจํ๊ณ ํ์ด ์ํด๋์์๋ค.
์ดํ ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ๋ฉด ๋๋๊ฐ? ์ง์งํ ๊ณ ๋ฏผ์ ์ด์ด๊ฐ๋ค. ๊ทธ๋ ๊ฒ ํ๋ ๋ ธ๋ ฅ๊ณผ ๋ณด์์ฑ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- kqueue ์ง์์ ๋ํ ๊ณต์ : kqueue ๋ฅผ ์ดํดํ๋ ๊ณผ์ ์ ๋งค์ฐ ์ด๋ ค์ด๋ฐ๋ค, ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ ๋น์ทํ๊ฒ ๊ณต์ ํ ๋ค๋ ๊ฒ์ ์ด๋ ค์ ์ง๋ง, ์ดํ ํ์ต์ ํตํด kqueue ๋ฅผ ์ด์ฉํ echo ์๋ฒ ๊ตฌ์ถ, ๋ฉํฐ ์ฑ๋, ๋ฉํฐ ์ ์ ๊ธฐ๋ฐ์ echo ์๋ฒ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ฏธ๋ฆฌ ํด๋ณด๋ฉด์ ๊ธฐ๋ฅ์ ๋ํ ์ดํด๋๋ฅผ ์ป์ ์ ์์๋ค. ์ด๋ฌํ ์ ์ ๊ณ ๋ คํ์ฌ ๋ชจ๋๊ฐ ํด๋ก ์ฝ๋ฉ์ ํตํด ์ดํดํ๊ธฐ ์ฝ๋๋ก ์ ๋ํ์๋ค.
- ๋คํ์ฑ์ ๊ฐ์ถ ํตํฉ ์์ ์ฒด๊ณ ๊ณ ์: C++ ์ ๋คํ์ฑ, ์์์ ํ์ฉํ๊ณ , ๊ฒฐ๊ตญ ๋ ผ๋ธ๋กํน ๋น๋๊ธฐ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์ญํ (ํด๋ผ์ด์ธํธ, ์์ฒญ ์ฝ๊ธฐ, ํ์ผ ์ฝ๊ธฐ, CGI, ํ๋ก์ธ์ค ์ข ๋ฃ ๋ฑ)์ ๋ฐ๋ผ ํ์ ์์ ์ ์ํํ๋ ํ๋ถ ํด๋์ค๋ค์ ๋ง๋ค์๋ค. ์ด ํด๋์ค๋ค์ ๋์ผํ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ฉํ๋ฏ๋ก, ๋ฉ์๋๋ค์ ์ญํ ์ ๊ท๊ฒฉํํ๊ณ , ๊ทธ ์ํฉ์ ์ ๋ํ์ฌ ์ณฌ๊ณ์ ๋์ง์ฑ์ ๋์ฌ์, ๊ฐ๋ฐ์๋ค ์ฌ์ด์ ๋ ผ์๊ฐ ์ฉ์ดํ ์ ์๊ฒ ๊ตฌํ๋์๋ค.
- ์์ฒด์ ์ธ ๋ก๊น ์์คํ ๊ตฌํ: ๋น๋๊ธฐ, ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๊ฐ์ฅ ์ด๋ ค์ด ์ง์ ์ ๋๋ฒ๊น ์, ์ด๋ค ์์ ์ ์ด๋ค ์ผ๋ค์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ชจ๋ฅธ๋ค๋ ์ ์ด์๋ค. ์ด์, ์์ ์ ๋ํ ์์ ํด๋์ค, ํ๋ถ ํด๋์ค๋ค๋ก ๋ง๋ค์๋ค๋ ๊ฒ์ ํ์ฉํ์ฌ ๋ก๊น ์ ์ํํ๋ ํด๋์ค๊น์ง ํฌํจํ์ฌ, ์ธ์ ์ด๋ค ์์ ๋์ค์ ์๋ฌ๊ฐ ๋ ๊ฒ์ธ์ง๋ฅผ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ๊ฐ๋จํ๊ฒ ๊ตฌํํ์ฌ ์ ๊ณตํ์๋ค.
- ์ฌํํ์ง๋ง ๋ช ํํ ์ปจ๋ฒค์ ์ง์ : ๋ณต์กํ๊ณ ์ด๋ ค์ด ์ปจ๋ฒค์ ์ ์ง์ ํ๋ ์์ผ๋ก๋, ์ด๋ฅผ ์งํค๋ค ํจ์จ์ฑ์ด ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ด์ ์ฌํํ๊ฒ ์ปจ๋ฒค์ ์ ๋ฏธ๋ฆฌ ํฉ์ํ๋๋ก ์ ๋ํ์๊ณ , PR ์์๋ ์ง์ ๋ ๋ฆฌ๋ทฐ ๋ฐฉ์์ ์ํ๋ง ํ๋ฉด ๋ฌธ์ ์๋ค๋ ์์ผ๋ก ํฉ์๋ฅผ ํตํด, ํ ์ ์ฒด๊ฐ ๋ณต์กํ์ง ์์ง๋ง, ๊ฐ๋ ฅํ ๊ธฐ์ค ํ์ PR ์ ์ํํ๊ณ , ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ ๋ฑ์ ํํ๋ฅผ ์ด์ด ๋๊ฐ๋๋ก ๋ง๋ค์๋ค.
์ด๋ฌํ ๋ด์ฉ๋ค์ ํตํด ์ต์ด ํ์์ ์๊ฒผ๋ ๋ฌธ์ ๋ค์ ๊ทน์ ์ผ๋ก ์ํ ๋์๊ณ , ๊ธฐ์กด์ ๋๋ฌ์ ์๊ฐ์ด ๊ฑธ๋ ค ์์ ์ด ์งํ์กฐ์ฐจ ๋์ง ์๋ ์ํฉ์์, 2์ฐจ ํ์ ๋ช ์ฃผ๋ง์ ์ผ๊ฐ๊ฐ ์ง์ฌ์ก๊ณ , 1๋ฌ ์ ๋๋ก ๊ฑฐ์ ์์ฑ ๋จ๊ณ๊น์ง ๊ฐ๋ฐ์ ๋ง๋ฌด๋ฆฌ ํ ์ ์์๋ค.
โจ ์ฑ์ฐฐ ๋ฐ ๋ฐฐ์ด ์
webserv๋ ์ธํฐ๋ท์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ๊ณผ HTTP ํต์ ์ ์ค์ฒด๋ฅผ ์ฝ๋๋ก ์ฆ๋ช
ํด๋ด๋ ๊ณผ์ ์ด๋ค. ๋ํ ์ด๋งํผ์ ๊ตฌ์กฐ๋ฅผ ํ์ผ๋ก ํด๋๊ฐ๋ ๊ฒ์ ๊ฒฝํํ๋ฉด์ ์ํต๊ณผ ์ด๋ค ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ์ฌ ํจ๊ป ํด๋๊ฐ๋์ ๋ฐ๋ผ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ๋๋์ง๋ฅผ ์ ์ ์์๋ค.
- ์์คํ ์ํคํ ์ฒ์ ์ดํด: ๊ณ ์ฑ๋ฅ ์๋ฒ๊ฐ ์ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์ด์ผ ํ๋์ง์ ๋ํ ๊น์ ๊ณตํ์ ์ดํด๋ฅผ ์ป์๋ค. ์ด๋ ๋จ์ํ ์ฝ๋ฉ์ ๋์ด ์์คํ ์ ์ฒด์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๊ณ ๋ คํ๋ ์ํคํ ํธ์ ์๊ฐ์ ๊ธธ๋ฌ์ฃผ์๋ค.
- ํ๋กํ ์ฝ์ ์ค์์ฑ: HTTP์ CGI๋ผ๋ ์๊ฒฉํ โ์ฝ์(Protocol)โ ์์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ, ์๋ฒ์ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์ง์์ ์ฐํ๊ฒ ์ํธ์์ฉํ๋์ง๋ฅผ ์ฒด๊ฐํ๋ค. ๋ชจ๋ ํ๋ ๊ธฐ์ ์ ์ ์ ์๋ ํ๋กํ ์ฝ ์์ ์ ์์์ ๊นจ๋ฌ์๋ค.
- ์ ์์ค ์ ์ด์ ํ: C++์ ์์คํ ์ฝ๋ง์ผ๋ก ๋คํธ์ํฌ ์คํ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ ์ง์ ์ ์ดํ๋ ๊ฒฝํ์, ํ๋ ์์ํฌ ๋ค์ ์จ๊ฒจ์ง ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ ์ง๋จํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋์๋ค.
- ํ์ ์ ์ค์์ฑ, ๋ฐฉ์์ ์ดํด: ํ์ ๊ณผ์ ์์ ์ปจ๋ฒค์ ์ ๋ช ํํด์ผํ๋ฉฐ, ํนํ๋ ์กฐ์ฌํด์ผ ํ ๊ฒ์ ์ปค๋ฎค๋์ผ์ด์ ์ ๋ฐฉํดํ๋ ์ง์์ ์์ค, ์ํต ๋ฐฉ์์ ๋ถ์ฌ ๋ฑ์ด ์ผ๋ง๋ ํ ๊ฐ๋ฐ์์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋์ง๋ฅผ ์ ์ ์์๋ค.
webserv๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์, ๋ธ๋ผ์ฐ์ ์ URL ์
๋ ฅ์ฐฝ ๋ค์์ ๋ฒ์ด์ง๋ ๊ฑฐ๋ํ ํต์ ์ ์ค์ผ์คํธ๋ผ๋ฅผ ์ง์ ์งํํ ์ ์๋ ์ญ๋์ ๊ฐ์ถ์์์ ์๋ฏธํ๋, ๊ฐ๋ฐ์๋ก์์ ์ค์ํ ์ด์ ํ์๋ค. ๋์์ ๋น๋ก ์ค์ , ์ค์ ๋ผ์ด๋ธ ์๋ฒ๋ฅผ ๊ฐ๋ฐํด๋ณด๊ฑฐ๋ ํ๋ ๊ฒ์ ์๋์์ง๋ง, ๊ทธ๋ผ์๋ ๋งค์ฐ ํ๋ฅญํ ํ์
์ ๊ฒฝํ์ด์, ์ํ์ง๋ง ์ฑ์ฅ ๊ฐ๋ฅ์ฑ์ ๋ค์ ํ ๋ฒ ๋ง ๋ณผ ์ ์๋ ๊ธฐํ๋ผ ํ ์ ์๊ฒ ๋ค.
