-
Notifications
You must be signed in to change notification settings - Fork 7
nginx load balancing
ํด๋น ๊ธ์ ๋ธ๋ก๊ทธ์๋ ์์ฑํด๋์์ต๋๋ค.
์ฐ์ ์ํ๋ ๊ตฌ์กฐ๋ ์์ ๊ฐ์ผ๋ฉฐ, ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- nginx๋ proxy์ญํ ์ ํ๋ฉฐ, ๋ณ๋์ ์ธ์คํด์ค๋ก ๊ตฌ์ฑํ๋ค.
- WAS๋ Spring Application์ด๋ฉฐ, ์ด ๋ ๋๋ก ๊ตฌ์ฑํ๋ค.
- ๋ ๋์ WAS๋ ํ๋์ Database๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ ํด์ง ๋๋ฉ์ธ์ผ๋ก ์ ์ํ๋ฉด, nginx์์ round-robin ๋ฐฉ์์ผ๋ก ์ ์ ํ WAS๋ก ์์ฒญ์ ๋ถ๋ฐฐํ๋ฉฐ, ๊ฐ WAS๋ ๋์ผํ DB๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ ์ ์๋ค. ์ฌ์ค ๋๋ฌด ๊ฐ๋จํด์ ๊ธ๋ก ์ฐ๊ธฐ๋ ๋ญฃํ์ง๋ง.. ๋์ค์ ์ํด!
Spring Application์ ๋์ธ EC2 ์ธ์คํด์ค๋ฅผ ํ๋ ์์ฑํ๋ค.
์์ฑ๋ EC2์ ์ ์ํ ๋ค, ์คํ๋ง์ ๋์ธ ์ ์๋ ํ๊ฒฝ์ค์ ์ ํ๋ค.
sudo apt update
sudo apt install default-jre
sudo apt install default-jdk
์ดํ, ์์ค์ฝ๋๋ฅผ github์์ ํด๋ก ํ๋ค.
git clone -b {branch๋ช
} --single-branch {๋ ํฌ์งํ ๋ฆฌ ์ฃผ์}
// ์๋ธ๋ชจ๋์ด ํฌํจ๋์ด์์ผ๋ฉฐ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ๋ฐ๋ผ๋ณด๊ณ ์๋ ์๋ธ๋ชจ๋์ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ
git clone -b {branch๋ช
} --single-branch {๋ ํฌ์งํ ๋ฆฌ ์ฃผ์} --recurse-submodules
// ์๋ธ๋ชจ๋์ด ํฌํจ๋์ด์์ผ๋ฉฐ ์ต์ ์ ์๋ธ๋ชจ๋์ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ
git clone -b {branch๋ช
} --single-branch {๋ ํฌ์งํ ๋ฆฌ ์ฃผ์} --remote-submodules
ํด๋ก ํ ๋ ํฌ์งํ ๋ฆฌ์์ build.gradle์ด ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ ๋ค ์์ค์ฝ๋ ๋ฐฐํฌ, ๋น๋๋ฅผ ์งํํ ๋ค ์คํํ๋ค.
./gradlew clean build
cd build/libs
java -jar -Dspring.profiles.active={activeProfile} *.jar &
์ด ๊ณผ์ ์ ๋ ๊ฐ์ ์ธ์คํด์ค์์ ๊ฐ๊ฐ ์งํํ๋ค.
์ดํ pull request ๋ฐ push์ ๋ฐ๋ผ ์๋์ผ๋ก ๋น๋ ๋ฐ ์คํ์ด ์งํ๋๋๋ก ํ๊ธฐ ์ํด์๋ jenkins์ ์ฐ๋ํ๋ ๊ฒ์ด ์ข๋ค.
ps -ef | grep java
์ ๋ช ๋ น์ด๋ฅผ ํตํด java -jar .. ์ด ํ๋ก์ธ์ค๋ก์ ์คํ๋๊ณ ์๋์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค. ๋น๋๋ ๋์ง๋ง ์คํ์ด ์๋ ์๋..
๋ ๋์ WAS๋ฅผ ๋ชจ๋ ๋์ ๋ค๋ฉด, nginx ์ญํ ์ ๋ด๋นํ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ธ์คํด์ค๊ฐ ์์ฑ๋์๋ค๋ฉด, ๋จผ์ ๋์ปค๋ฅผ ์ค์นํ๋ค.
sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
๋ด๊ฐ ์งํํ nginx๋ ๋์ปค์์ ์ค์นํ๋ฉฐ, ์ฐ์ํ ํ ํฌ์ฝ์ค์์ ์ ๊ณตํด์ฃผ๋ docker image๋ฅผ ์ฌ์ฉํ๋ค. ๋์ค์ ์๋ฒ์ ์ง์ nginx๋ฅผ ์ค์นํด์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ํด๋ณด์์ผ๊ฒ ๋ค.
์๋ฌด์ชผ๋ก ๋์ปค๊ฐ ์ค์น๋์๋ค๋ฉด, ์ด์ http://๋ด๋๋ฉ์ธ.ํ๊ตญ ์ ์ ์ํด์ ์ฌ์ฉํ ๋ฌด๋ฃ ๋๋ฉ์ธ์ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ TLS ์ค์ ์ ์งํํ๋ค.
์๋ฒ์ ๋ณด์๊ณผ ๋ณ๊ฐ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํต์ ์์ ์ํธํ๊ฐ ํ์ํ๊ธฐ์ TLS๋ฅผ ์ค์ ํด์ค๋ค. ํ๋ฌธ์ผ๋ก ํต์ ํ ๊ฒฝ์ฐ, ํจํท์ ์ค๋ํํ ์ ์๋ค.
letsencrypt๋ฅผ ํตํด ๋ฌด๋ฃ๋ก TLS ์ธ์ฆ์๋ฅผ ์ฌ์ฉํด๋ณด์.
docker run -it --rm --name certbot \
-v '/etc/letsencrypt:/etc/letsencrypt' \
-v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
certbot/certbot certonly -d '[๋๋ฉ์ธ ์ฃผ์]' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ธ์ฆ์๋ฅผ ์์ฑํ๋ ์ค, Please deploy a DNS TXT record under the name ์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋์ค๋ฉด ๋ค์์ ์งํํ๋ค.
TXT๋ ๋ด๋๋ฉ์ธ.ํ๊ตญ์ ๋๋ฉ์ธ ์ค์ ์์ ์งํํ๋ ๊ฒ์ด๋ฉฐ, ๋ด๋๋ฉ์ธ.ํ๊ตญ์์ ์ ๋ ฅ์ ๋ชจ๋ ๋ง์น๊ณ ์ ์ฅํ ๋ค ์ฝ 5์ด์ ๋ ๊ธฐ๋ค๋ฆฐ ๋ค์ letsencrypt ์ค์ ์ ์๋ฃํด์ฃผ๋ฉด ์ ์์ ์ผ๋ก ์๋ฃ๋๋ค.
์์ฑํ ์ธ์ฆ์๋ฅผ ํ์ฌ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ค.
sudo cp /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/fullchain.pem ./
sudo cp /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/privkey.pem ./
vi Dockerfile ์ด๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํตํด Dockerfile์ ์์ฑํ๊ณ , ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
// Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY fullchain.pem /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/fullchain.pem
COPY privkey.pem /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/privkey.pem
๊ฐ์ ๋๋ ํ ๋ฆฌ์์ vi nginx.conf ํ์ผ์ ์์ฑํ ๋ค, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
events {}
http {
# ์์ฑํ ๋ ๋์ WAS private IP๋ฅผ upstream app ์๋์ ์์ฑํ๋ค.
upstream app {
server {WAS private IP}:{ํฌํธ๋ฒํธ};
server {WAS private IP}:{ํฌํธ๋ฒํธ};
}
# Redirect all traffic to HTTPS
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[๋๋ฉ์ธ์ฃผ์]/privkey.pem;
# Disable SSL
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ํต์ ๊ณผ์ ์์ ์ฌ์ฉํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
# Enable HSTS
# client์ browser์๊ฒ http๋ก ์ด๋ ํ ๊ฒ๋ load ํ์ง ๋ง๋ผ๊ณ ๊ท์ ํฉ๋๋ค.
# ์ด๋ฅผ ํตํด http์์ https๋ก redirect ๋๋ request๋ฅผ minimize ํ ์ ์์ต๋๋ค.
add_header Strict-Transport-Security "max-age=31536000" always;
# SSL sessions
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://app;
}
}
}
nginx๊ฐ ์ฌ๋ฌ ์๋ฒ์ ๋ถ๋ฐฐํด์ฃผ๋ฏ๋ก upstream ์๋ฒ์ ์์ฑํ๋ค. ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์์ฒญ์ ๊ณ ๋ฃจ ๋ถ๋ฐฐํด์ ์๋ฒ๋ก ๋๊ฒจ์ฃผ๋๋ฐ, ์ด ๋ ์ด๋ป๊ฒ ๋ถ๋ฐฐํ ์ง ๊ท์น์ ์ ํด์ค ์ ์๋ค.
์ง๊ธ ์ nginx.conf์ฒ๋ผ ์๋ฌด ๊ท์น๋ upstream์ ์ ์ง ์๊ณ server ip๋ง ์์ฑํ๋ค๋ฉด default์ธ round-robin ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋๋ค.
upstream app {
ip_hash;
server {WAS private IP}:{ํฌํธ๋ฒํธ};
server {WAS private IP}:{ํฌํธ๋ฒํธ};
}
ip_hash๋ฅผ ์ ์ด์ฃผ๊ฒ ๋๋ฉด, ip๋ฅผ ํด์๊ฐ์ผ๋ก ๋๋ ์ฃผ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋ถ๋ฐฐํ๊ฒ ๋๋ฉด ํ๋ฒ ์ ์ํ๋ ip๋ ๊ฐ์ ํด์๊ฐ์ ๊ฐ์ง๋ฏ๋ก ๋งค๋ฒ ๋์ผํ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค. ์ธ์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. (์ฝ๊ฐ์ ๋ํผ์ )
์ด ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- round-robin(default)
- hash - hash <ํค> ํํ๋ก ์์ฑํ๋ฉฐ ํด์ํ ๊ฐ์ผ๋ก ๋ถ๋ฐฐํ๋ค. ex)hash $remote_addr (= ์ด๋ ip_hash์ ๊ฐ๋ค)
- ip_hash - ์์ดํผ๋ฅผ ํด์ฑํด ์์ฒญ์ ๋ถ๋ฐฐํ๋ค.
- random
- least_conn - ์ฐ๊ฒฐ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฒ์ ๊ฐ์ค์น๋ฅผ ๊ณ ๋ คํด์ ๋ถ๋ฐฐ
- least_time - ์ฐ๊ฒฐ์๊ฐ ๊ฐ์ฅ ์ ์ผ๋ฉด์ ํ๊ท ์๋ต์๊ฐ์ด ๊ฐ์ฅ ์ ์ ์ชฝ์ ์ ํํด์ ๋ถ๋ฐฐ ์์ธํ ๋ด์ฉ์ nginx-stream-upstream-module ์์ ํ์ธํ ์ ์๋ค.
๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ์ค ๊ฐ์ค์น๋ผ๋ ๋ง์ด ๋์๋๋ฐ ํน์ ์๋ฒ์ 2๋ฐฐ์ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
upstream app {
server {WAS private IP}:{ํฌํธ๋ฒํธ} weight=2;
server {WAS private IP}:{ํฌํธ๋ฒํธ};
}
์์ ๊ฐ์ด ์์ฑํ๋ฉด ๊ท์น์ ๋ผ์ด๋ ๋ก๋น์ผ๋ก ์ ์งํ๋ ์ฒซ๋ฒ์งธ ์๋ฒ๋ฅผ 2๋ฐฐ ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
nginx์ configuration์ ํตํด ๋ก๋๋ฐธ๋ฐ์ฑ ์ค์ ์ ๋ชจ๋ ๋ง์ณค์ผ๋, ๋์ปค ์ปจํ ์ด๋๋ฅผ ๋์ฐ๋ฉด ์ ์์ ์ผ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
docker build -t nextstep/reverse-proxy:0.0.2 .
docker run -d -p 80:80 -p 443:443 --name proxy nextstep/reverse-proxy:0.0.2
๋
Code Convention
- AWS ๋ฐฐํฌ ๋ฐ Jenkins CI/CD ๐ณ
- Nginx๋ก ๋ก๋ ๋ฐธ๋ฐ์ฑํ๊ธฐ
- How to Git Rebase?
- ์๋ชป๋ ๊น ๋ธ๋์น์์ ํ์ถํ๊ธฐ
- ์๋ธ๋ชจ๋ ๋์ ๊ธฐ
- ์๋ํ๋ธ ๋์ ๊ธฐ
- Flyway ๋์ ๊ธฐ
- DB Replication์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ ์ค์
- ๋ฌด์ค๋จ ๋ฐฐํฌ ๋์ ๊ธฐ
- nginx ์ค์ ํ์ผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
- ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ํ๋ฆ์ ๋ฆฌ
- About Redis
- Criteria -> QueryDSL๋ก ๋ณ๊ฒฝ
- S3 ํ์ผ ์ ๋ก๋ ๊ตฌ์กฐ
- 1์ฐจ ์คํ๋ฆฐํธ 1์ฐจ ๋ฐ์ผ๋ฆฌ ๋ฏธํ
- 1์ฐจ ์คํ๋ฆฐํธ 2์ฐจ ๋ฐ์ผ๋ฆฌ ๋ฏธํ
- 1์ฐจ ์คํ๋ฆฐํธ 3์ฐจ ๋ฐ์ผ๋ฆฌ ๋ฏธํ
- 2์ฐจ ์คํ๋ฆฐํธ ๋ฐ์ผ๋ฆฌ ๋ฏธํ
2์ฐจ ~ 4์ฐจ ํ์ ๋ฐ ๋ฐ์ผ๋ฆฌ ๋ฏธํ ์ ๋์ค์ฝ๋์์ ์งํ๋์ด ์ด์๋ก ๋ฐ์๋์์ต๋๋ค.
- 5์ฐจ ์คํ๋ฆฐํธ ์๋ก์ด ๊ธฐ๋ฅ ๋์ ํ์
- Lv4. 1์ฐจ ์๋ก์ด ๊ธฐ๋ฅ ๋์ ํ์
- Lv4. 2์ฐจ ์๋ก์ด ๊ธฐ๋ฅ ๋์ ํ์
์ดํ ํ์ ๋ฐ ๋ฐ์ผ๋ฆฌ ๋ฏธํ ์ ๋์ค์ฝ๋์์ ์งํ๋์ด ์ด์๋ก ๋ฐ์๋์์ต๋๋ค.