Youpi Webserv
by yeha, yeosong and kukim
@42seoul : (2021.02.10 ~ 2021.05.03)
Nginx
์ ์ ์ฌํ ์น์๋ฒ ๊ฐ๋ฐ- ๋ฉํฐ ํ๋ก์ธ์ค, ์ฐ๋ ๋๊ฐ ์๋
๋ฉํฐ ํ๋ ์ฑ(Multiplexing)
์ ํ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค. - ์๋์ Nginx์ ์ ์ฌํ๊ฒ conf ํ์ผ๋ก ์น์๋ฒ๋ฅผ ์ ์ ํฉ๋๋ค.
- Keyword : Socket Programming, HTTP/1.1 Request & Response, HTTP/1.1 Methods RFC, TCP/IP, Network, Multiplexing, Non-Blocking, Asynchronous, CGI, Webserver(Nginx)
- ํ ํ๋ก์ ํธ ์งํ์ ์ํ ๊ตฌ๊ธ ์ฝ๋ฉ ์ปจ๋ฒค์ , github, Branch Workflow๋ฅผ ์ค์ , ๊ธฐ๋ฅ๋ง๋ค ์ฝ๋๋ฆฌ๋ทฐ, ํ์ด์ฝ๋ฉ, ๋ง์ง๋ง์ refactoring ํ๊ธฐ๋ก ํ๋ค.
- ์ ๋ฐ์ ์ผ๋ก ์ฌ์ ์ง์์ด ์๊ธฐ ๋๋ฌธ์ C๋ฅผ ํ์ฉํ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ฌ์ผ๋ก ํ์ตํด๊ฐ๋ฉฐ ์ํฉ์ ๋ง๊ฒ ๊ฐ์ ํ๋ค.
- i.e. ์ฑ๊ธํ๋ก์ธ์ค ์น์๋ฒ์ ํ๊ณ : ๋ค์์ ํด๋ผ์ด์ธํธ ์๋ต ์ฒ๋ฆฌ ๋๋ ์ด ๋ฌธ์
- ๋ฉํฐํ๋ก์ธ์ค, ๋ฉํฐ์ค๋ ๋, ๋ฉํฐํ๋ ์ฑ ์ ํ์ง ์ค ๋ฉํฐํ๋ ์ฑ ์ ํ
- i.e. ๋ฉํฐ ํ๋ ์ฑ ์๋ฒ ๊ตฌํ ๋ฌธ์ ์ : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๋ผ ์๋ฒ ์์์ read, write ํ๋๋ฐ fd์ Blocking์ด ๊ฑธ๋ ค ์ง์ฐ ๋ฐ์
- fcntl()์ ์ฌ์ฉํด ํด๋น fd๋ฅผ Non-blocking ์ค์
- i.e. ํด๋ผ์ด์ธํธ๊ฐ ๋น์ ์ ์ข
๋ฃํ์ ๋
- ์๋ฒ ์ธก์์ sigpipe์ ์๊ทธ๋์ ์ฒดํฌํ๊ณ ๋น์ ์ ์ข ๋ฃ ๋ ํด๋น socket fd ๋ซ๊ธฐ
- i.e. ์๋ฒ ๋น์ ์ ์ข
๋ฃ, ์ฌ์์ Time-wait bind() ์ฌํ ๋น ๋ฌธ์
- SO_REUSEADDR ์ต์ ์ผ๋ก bind() ๋ฌธ์ ์ ๊ฑฐ
- i.e. RFC ๋ฌธ์์ ๋ฐ๋ผ HTTP/1.1 ํค๋๋ฅผ ๊ตฌํํ๋๋ฐ ํฌ๊ณ ์์ ์ด๋ ค์๋ค์ด ๋ง์๊ณ ์ค์ ๋ก ๊ตฌํ๋์ด ์๋ ๋ถ๋ถ์ ๋ํ ์ดํด๊ฐ ๊น์ด์ก๋ค.
- e.g.
Accept-Language
์์ฒญ์ ๋ฐ๋ผ content negotiation ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด RFC ๋ฌธ์์ ํน์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ๊ตฌํํ๋ค. - e.g.
Transfer-Encoding:chunked
์์ฒญ ํค๋๊ฐ ์๋ค๋ฉด ์๋ฒ์ธก์์ ์ ์กํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋๋ ์ ๋ณด๋ด๊ณ ๋ ๋ฉ์ธ์ง์ ๊ฐํ ๋๋ฒ + EOF - e.g. nginx์์ ๋ฆฌ๋ค์ด๋ ํธ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์์ฝ๊ฒ ์ฌ์ฉํ๋๋ฐ ๊ตฌํ์ ํด๋ผ์ด์ธํธ ํน์ ๋ฆฌ์์ค ์์ฒญ์ด redirect ๋๋ ๋ฆฌ์์ค๋ผ๋ฉด ์๋ฒ ์ธก์์ ๋จ์ํ๊ฒ ํด๋ผ์ด์ธํธ์๊ฒ redirect ๋์๋ค๊ณ
Location:uri
์๋ต ํค๋๋ฅผ ๋ณด๋ธ๋ค. ์ด์ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๋ฆฌ์์ค์ ์ฌ์์ฒญ ํ๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์๋ ์๋ฒ์ธก์์Location:uri
๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ง ์๊ณ ๋ฆฌ๋ค์ด๋ ํธ๋ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํด์ค๋ค. ๊ตฌํํ ๋ ์์ฃผ ๋จ์ํ ๋ถ๋ถ์ด์ง๋ง ๊ธฐ๋ฅ ์ฐจ์ด๊ฐ ํฌ๋ค.
- e.g.
- i.e. ์ฑ๊ธํ๋ก์ธ์ค ์น์๋ฒ์ ํ๊ณ : ๋ค์์ ํด๋ผ์ด์ธํธ ์๋ต ์ฒ๋ฆฌ ๋๋ ์ด ๋ฌธ์
- ๊ฐ์ ์ฌํญ
- ํ์ฌ ์๋ฒ๋ ๋ฉํฐ ํ๋ ์ (select() + fcntl()(non-blocking + asynchronous))์ผ๋ก ๋์ด์์ง๋ง cgi๋ฅผ ์ ์ธํ๊ณ ์ฑ๊ธ ํ๋ก์ธ์ค๋ก ์๋ํ๋ค. nginx์์๋ conf ํ์ผ์์ Worker Process ์ ์ค์ ์ผ๋ก ํ๋ก์ธ์ค ๊ฐ์๋ฅผ ์ค์ ํ ์ ์๋๋ฐ, ํ์ฌ ๊ตฌํํ webserv์์๋ cpu ์์ ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์์ฒญ์ด ์๋ค๋ฉด ์ ์ด์ ๋ฉํฐ ํ๋ก์ธ์ค,์ค๋ ๋๋ฅผ ๋ง๋ค์ด ์ฒ๋ฆฌํ๋ฉด ์ฒ๋ฆฌ ์๋๊ฐ ์ฆ๊ฐํ ์ ์๊ฒ ๋ค.
- ํ ์คํธ ์ฝ๋์ refactoring์ ๋น์ฝํ๋ค.
- ์น์๋ฒ์ log๊ฐ ๋ถ์กฑํ๋ค.
- HTTP Method test : GET, HEAD, POST
- Content negotiation, Redirect
- Authorization, Server pause 503, Siege test
- nginx
- config file
- Host, Port
- Server name
- setup default
- limit client body size
- Accepted HTTP Methods for the route
- autoindex On/Off
- redirect
- execute CGI (RFC 3275 ์ฐธ๊ณ )
- HTTP ํค๋(RFC 7230 ~ 7235, HTTP/1.1์ ์ฐธ๊ณ ํ์ฌ ์๋ ํค๋๋ฅผ ๊ตฌํํฉ๋๋ค.)
- Accept-Charsets
- Accept-Language
- Allow
- Authorization
- Content-Language
- Content-Length
- Content-Location
- Content-Type
- Date
- Host
- Last-Modified
- Location
- Referer
- Retry-After
- Server
- Transfer-Encoding
- User-Agent
- WWW-Authenticate