[Docker] nginx web server๋ฅผ ์ด์ฉํ ๋ก๋ ๋ฐธ๋ฐ์ฑ
์ต๊ทผ ๋ค์ด, ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํ์ฉํ๋ ค ๋ ธ๋ ฅํ๋ฉด์๋ ๊ฐ๋์ Docker๋ฅผ ๋ค์ ๋์๋ณด๋ ๊ฒฝํฅ์ด ๋ง์์ก์ต๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ทธ ์ค์์๋ ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ฌ๋ฌ๋ชจ๋ก ๋ง์ ๋์์ด ๋์์ต๋๋ค. ๋ฌด์๋ณด๋ค๋ 100๊ฐ ์ด์์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํด Docker Compose, Docker Swarm์ ๋ง์ด ์ฌ์ฉํ์๋ค๋ ์ . ์ด ๋ถ๋ถ์ ์๋์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ฒ๊ฑฐ๋ก์์ ๋ง์ด ๋์ด์ฃผ์๊ณ , ๊ทธ ๋๋ฌธ์ ์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ด์์ ๋ง์ด ์ ํธํ๋ ์ ์ด ๊ธฐ์ต์ ๋จ์์ต๋๋ค.
์๋ก ์ ์ ๊ณ , ์ด์ ๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ๋ณด์ฃ . ์ด์ ์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ๋ํ ๊ธ์ ์ฌ๋ ธ๋ ์ ์ด ์์์ต๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ค๋ฌด์์ ๋ง์ด ๋ค๋ฃจ๋ ๊ธฐ์ ์ด์ง๋ง ์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ์ญ์ ๊ฐ๋ ์ ๋ํด ์ ํํ ์๊ณ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
nginx
nginx๋ ์น ์๋ฒ ํ๋ก๊ทธ๋จ ์ค ํ๋๋ก ์ฑ๊ธ ์ค๋ ๋๋ก ์ด์๋๊ณ ์๋ ์์ ์น ์๋ฒ์ ๋๋ค. ์ด์ ์๋ apache2 ์น ์๋ฒ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ต๊ทผ์๋ nginx ์น ์๋ฒ๊ฐ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ฃ . ์ ๊ทธ๋ ๋๊ตฌ์? ๊ทธ ์ ์ ๋ฐ๋ก ์น ์๋ฒ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ์ฐจ์ด ๋ฑ์ด ์๋๋ฐ, ์ด ๋ถ๋ถ์ ํ์ฌ ๋ค๋ฃจ๊ณ ์ ํ๋ ์ฃผ์ ์ ์กฐ๊ธ ์ฐ๊ด์ฑ์ด ๋ฒ์ด๋๋ฏ๋ก, ๋ค๋ฅธ ํฌ์คํธ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ Docker ์ปจํ ์ด๋๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์ฑํ๊ธฐ ์ํด nginx ์น ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. nginx ์น ์๋ฒ์์๋ ์์ฒญ์ ๋ถ์ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋ก๋ ๋ฐธ๋ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์๋์ ๋ช ๋ น์ด๋ก nginx๋ฅผ ์ค์นํ๊ณ , Spring boot ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์์ผ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ sudo apt install nginx
์ค์น๊ฐ ๋๋ฌ๋ค๋ฉด, ์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ nginx service๊ฐ active (running) ์ธ์ง๋ฅผ ํ์ธํ์ฌ ์๋ฒ๊ฐ ์ ๊ตฌ๋๋๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
Create Docker Container
์๋น์คํ๊ณ ์ ํ๋ Docker ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ์ฃ ? ์ ๋ ๊ฐ๋จํ Spring boot Application์ 1๊ฐ ๋ง๋ค์ด์, ํฌํธ ์ฃผ์๋ฅผ ๊ฐ๊ฐ 3000, 4000, 5000๋ฒ ํฌํธ๋ฅผ ์ฃผ๊ณ , ํ ์คํธ๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
FROM openjdk:8-jdk-alpine
EXPOSE ${SERVER_PORT}
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar", "$@"]
๊ธฐ์กด์ Dockerfile์์ EXPOSE๋ฅผ ์ถ๊ฐํ์ฌ ๋ช ๋ น์ด ์ธ์๋ฅผ ์ฃผ๊ณ , Server Port๋ฅผ ์ค์ ํ๋ฉด, Docker ์ปจํ ์ด๋ ์์ฑ์, ๋ช ๋ น์ด์ ํฌํธ ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ฌ ์ํ๋ ํฌํธ ๋ฒํธ๋ก ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
# docker run -d -e SERVER_PORT 3000 -p 3000:3000 --name dockerexample01 neonkid/dockerexample
์ ๋ช ๋ น์ด๋ฅผ ๋ฐํ์ผ๋ก 3๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ญ๋๋ค.
Load Balancing Settings
๋ง์ง๋ง์ผ๋ก nginx ์น ์๋ฒ์์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
$ netstat -anp | grep LISTEN
๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์งํํ๊ธฐ ์ ์, ์ฐ๋ฆฌ๊ฐ ์ฃผ์ด์ค 3000 ~ 5000๋ฒ ํฌํธ์ ์๋น์ค์ nginx ์น ์๋ฒ๊ฐ ๋คํธ์ํฌ ์์์ ์ ๋์ํ๊ณ ์๋์ง ํ์ธํด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์ nginx ์ค์ ํ์ผ์ ์์ ๊ฐ์ด ๋ง๋ค์ด์ค๋๋ค. ์ค์ ํ์ผ์ ๋ํด ๊ฐ๋จํ ์ค๋ช ์ ๋๋ฆฌ์๋ฉด, upstream์ ์๋น์คํ๊ณ ์ ํ๋ ์๋น์ค๋ค์ ์ฃผ์๋ฅผ ๋์ดํ๋ ๊ณณ์ ๋๋ค. upstream์ ๋ป์ ์๋ฅ๋ผ๋ ๋ป์ธ๋ฐ, nginx๊ฐ ์๋ฅ์ ์๊ณ , ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด ํด๋น upstream์์ ์๋๋ก ๋ฟ๋ ค์ง ์๋น์ค๋ฅผ ๋์ดํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ upstream ์์๋ ํด๋น ์๋ฅ๊ฐ ์ด๋ค ์๋น์ค์ธ์ง ํ๊น ํ ์ ์๋ ์ด๋ฆ์ ์ ์ผ์๋ฉด ๋ฉ๋๋ค.
nginx๋ ์ ์ ํ์ด์ง ๋ก๋ฉ์ ์ต์ ํ๋ ์น ์๋ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋ถ์ฌ์ง๋ ์ ์ ์๋ํฌ์ธํธ์ ๋ํด์ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ต์์ ์๋ํฌ์ธํธ์ ๋ํด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ๋๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์ proxy_pass๋ฅผ ์ด์ฉํ์ฌ nginx๋ฅผ ํ๋ก์ ์๋ฒ๋ก ์ผ๊ณ upstream ๋ฆฌ์คํธ์ ์๋ ์๋ฒ๋ก ํต๊ณผ์ํค๋๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ์๋ก๊ณ ์นจํ ๋๋ง๋ค ์ ์ ์ธ์คํด์ค๊ฐ ๊ณ์ ๋ฐ๋๊ณ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
nginx์ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ์
์ฐ๋ฆฌ๋ nginx ์น ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ Docker ์ปจํ ์ด๋์ ๋ด๊ฒจ์ง ์๋น์ค๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ์์ต๋๋ค. ๋ฐ๋ผ์ nginx๊ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์๋น์ค๋ Docker ์ปจํ ์ด๋์์ ๋ฐ๋ ์๋ฆฌ์ธ ๊ฒ์ด์ฃ .
๊ทธ๋ ๋ค๋ฉด nginx ์น ์๋ฒ๊ฐ ์ ๊ณตํ๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ์์ ๋ํด ๊ณต๋ถํ ํ์๊ฐ ์์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ง๊ธ ์ฐ๋ฆฌ๋ ์๋ก๊ณ ์นจ๋ง๋ค ์ธ์คํด์ค๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ ์ํ์์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ด๋ค๋ผ๋ฆฌ ๊ณต์ ๋์ง ์๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ์ฃ ?
- RR (Round-Robin, default): ์ฒ์๋ถํฐ ์ฐจ๋ก๋๋ก ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ
- hash: hash ๊ฐ์ผ๋ก ๋ถ๋ฐฐํ๋ ์๊ณ ๋ฆฌ์ฆ ex) hash $remote_address๋ก ip_hash ๊ฒฐ์
- ip_hash: ์ ์ํ IP ์ฃผ์๋ฅผ hashing ํ์ฌ ๋ถ๋ฐฐ
- random: ๋ฌด์์๋ก ๋ถ๋ฐฐ
- least_conn: WLC ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋์ผ (์ ์์๊ฐ ์ ์ ์๋ฅผ ๋ถ๋ฐฐํ๋, ๊ฐ์ค์น ์ค์ )
- least_time: ์ฐ๊ฒฐ์๊ฐ ์ ์ผ๋ฉด์ ํ๊ท ์๋ต ์๊ฐ์ด ๊ฐ์ฅ ์ ์์ชฝ์ ์ ํํ์ฌ ๋ถ๋ฐฐ (SED ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌ)
๊ธฐ์กด ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ์๊ณผ ๊ฑฐ์ ๋น์ทํ ํํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ ๊ฒ๋ ์๊ณ , ์์ ์๋ก์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ณตํ๋ ์๊ณ ๋ฆฌ์ฆ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ค์ ์๋ง๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ํ๋ช ํ ์ ํ์ผ ๊ฒ์ ๋๋ค
๋ง์ฝ, ip_hash๋ฅผ ์ค๋ค๊ณ ํ๋ค๋ฉด..
์ ์ํ IP์ ๋งคํ์ํจ upstream์ ํด์ฌ๊ฐ์ผ๋ก ์ ์ฅํ์ฌ ๋ถ๋ฐฐํ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ ์ํ IP๋ ํญ์ ์ด ์ธ์คํด์ค๋ก๋ง ์ ์ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ ๊ฐ์ค์น๊ฐ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊น์?
์ด๋ ๊ฒ ์ต์ ์ฐ๊ฒฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๋ค, ์ํ๋ ์ธ์คํด์ค ์ฃผ์ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฃผ์ด์ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ ํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
- weight: ๊ฐ์ค์น๋ฅผ ์ค์ ํ์ฌ ๋ ๋ง์ ์ฌ์ฉ์๋ฅผ ๋ฐ๋๋ก ํ๋ ํ๋ผ๋ฏธํฐ
- max_conns: ์ต๋ ๊ฐ์ฉ ์ฐ๊ฒฐ ์๋ฅผ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ
- max_fails: ์ต๋ ์คํจ ํ์๋ฅผ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ, ์ต๋ ์คํจ ํ์๊ฐ ๋๋ฌํ ๊ฒฝ์ฐ, nginx๊ฐ ๋ ์ด์ ์ด ์ธ์คํด์ค๋ฅผ ๋ถ๋ฐฐํ์ง ์์
- fail_timeout: ์๋ต ์ต์ ์๊ฐ์ ์ง์ ํ๋ ํ๋ผ๋ฏธํฐ, ์๋ต ์๊ฐ์ด ์ง๋๋ฉด ์คํจ ํ์ ์นด์ดํธ๊ฐ ์ฆ๊ฐ๋จ
- backup: ํด๋น ์ธ์คํด์ค๋ฅผ ๋ฐฑ์ ์๋ฒ๋ก ์ค์ , ๋ค๋ฅธ ๋ฉ์ธ ์๋ฒ๊ฐ ์๋ตํ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง๋ง hash๋ random ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋์ํ์ง ์์
- down: ํด๋น ์๋ฒ๋ ์ฃฝ์์์ ํ์ํ๊ณ , ๋ถ๋ฐฐํ์ง ์์
๋ค์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฉํด์ ์ธ์คํด์ค ๋ถ๋ฐฐ ๋ฐฉ์์ ์ค์ ํ ์ ์๋ ์ ์ ๋ฉ๋ฆฌํธ ์์ด ๋ณด์ด๋ค์.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง nginx ์น ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ Docker ์ปจํ ์ด๋๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, nginx ์น ์๋ฒ๊ฐ ๋น๊ต์ ๊ฐ๋ณ๊ณ , ์ฌ์ฉํ๊ธฐ ํธํ ์ฅ์ ์ ์์ง๋ง ๊ตณ์ด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํด์ nginx ์น ์๋ฒ๋ฅผ ์ฌ์ฉํด๋งํ ๊น์? ๊ผญ ๊ทธ๋ ์ง๋ง์ ์์ต๋๋ค. Docker ์ปจํ ์ด๋๋ฅผ ์ด์ฉํด์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ,
๋ค์ ํฌ์คํธ์์๋ HAProxy๋ฅผ ์ด์ฉํ์ฌ Docker ์ปจํ ์ด๋๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Infrastructure > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] HAProxy๋ฅผ ์ด์ฉํ ๋ก๋ ๋ฐธ๋ฐ์ฑ (0) | 2020.06.14 |
---|---|
Docker ์ฌ์ฉ์ ์ ์ ๋คํธ์ํฌ ๊ตฌ์ฑ (0) | 2016.07.24 |
Docker ๋คํธ์ํฌ ๊ตฌ์ฑ๊ณผ ์ค์ (0) | 2016.07.20 |
Docker, ๊ทธ๊ฒ์ ๋ฌด์์ด๊ณ , ์ค์น๋ ์ด๋ป๊ฒํ ๊น? (0) | 2016.07.06 |