[Infra] 4-Tier ์์ธ ๋ถ์ 1ํธ: Nginx๋ฅผ ํ์ฉํ ๋ฆฌ๋ฒ์ค ํ๋ก์์ ๋ณด์ ๊ฐํ
์๋ ํ์ธ์ ๋๋ฆฌ๋!
์ธํ๋ผ ์์ธ ๋ถ์ ์๋ฆฌ์ฆ์ ์ฒซ ๋ฒ์งธ ์ฃผ์ธ๊ณต์ ์ฐ๋ฆฌ์ ์น ์๋ฒ์ด์ ๊ฐ๋ ฅํ ๋ณด์ ํํฐ์ธ Nginx์ ๋๋ค. ๐ก๏ธ๐ป
Nginx๋ ๋จ์ํ ์น ์๋ฒ๋ฅผ ๋์ด, ์๋น์ค์ ์ต์ ๋ฐฉ์์ ํธ๋ํฝ์ ์ ์ดํ๊ณ ๋ณด์์ ์ฑ ์์ง๋ ํต์ฌ์ ์ธ ์ญํ ์ ์ํํฉ๋๋ค.
0. Nginx ์ค์น ๋ฐ ๊ตฌ๋ (Docker ํ๊ฒฝ)
์ฐ๋ฆฌ ์๋น์ค๋ ๊ด๋ฆฌ ํจ์จ์ฑ์ ์ํด Docker ๋ฐ Docker Compose๋ฅผ ํตํด Nginx๋ฅผ ์ด์ํฉ๋๋ค. ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์ ๊ตฌ์ฑํ์ฌ ๋ฐฐํฌ๊ฐ ๋งค์ฐ ๊ฐํธํฉ๋๋ค.
# docker-compose.yml ์ค์ ์์
services:
web:
image: nginx:latest
container_name: nginx-web
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
networks:
- app-network
# ์ปจํ
์ด๋ ์คํ ๋ช
๋ น์ด
docker compose up -d
# Nginx ์ค์ ๋ณ๊ฒฝ ํ ์ ์ฉ (์ปจํ
์ด๋ ์ฌ์์ ์์ด)
docker exec nginx-web nginx -s reload1. ๋ฆฌ๋ฒ์ค ํ๋ก์(Reverse Proxy)์ ์ญํ
์ฐ๋ฆฌ ๊ตฌ์กฐ์์ Nginx๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋ด๋ถ๋ง์ ์๋ Tomcat(WAS)์ด๋ Grafana ๋ฑ์ผ๋ก ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ด๋ถ ์๋ฒ์ IP๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์๊ณ ์์ ํ๊ฒ ๋ณดํธํ ์ ์์ต๋๋ค.
2. HTTPS ๋ณด์ ์ ์ฉ (Certbot & Let's Encrypt)
80๋ฒ ํฌํธ(HTTP)๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์์ ํ 443๋ฒ ํฌํธ(HTTPS)๋ก ์๋ ๋ฆฌ๋ค์ด๋ ํธ ์ฒ๋ฆฌํฉ๋๋ค.
server {
listen 80;
server_name itinform.site;
location / {
return 301 https://$host$request_uri;
}
}3. ์ค์ ๋ณด์: IP ํ์ดํธ๋ฆฌ์คํธ ๊ธฐ๋ฐ ์ด๋๋ฏผ ์ฐจ๋จ
์ด๊ฒ์ด ์ฐ๋ฆฌ ๋ธ๋ก๊ทธ ๋ณด์์ ํต์ฌ์ ๋๋ค! ์ผ๋ฐ ๊ธ ๋ณด๊ธฐ๋ ์ ์ฒด ๊ณต๊ฐ๋ก ๋๋, ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ์ด๋ ์์ /์ญ์ ์ก์ ์ด ํฌํจ๋ ์์ฒญ์ ์ฌ์ ์ ํ์ฉ๋ IP์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ฐจ๋จํฉ๋๋ค.
ํ์ฉ๋์ง ์์ IP๋ ๊น๋น์๊ฐ ๋ง๋ ์ ์ฉ ์ฐจ๋จ ํ์ด์ง(blocked.html)๋ก ์๋ด๋ฉ๋๋ค.
4. ์ค์ ์ ์ฉ๋ ์ฃผ์ ์ค์ ์์
# [Nginx] ํน์ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ์ ๊ทผ ์ ์ด ๋ฐ IP ํ์ดํธ๋ฆฌ์คํธ ์ค์
location / {
proxy_pass http://was:8080/blog.jsp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# ๊ด๋ฆฌ์ ๊ธฐ๋ฅ ์ ๊ทผ ์ ์ด (์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฒดํฌ)
set $admin_blocked "N";
if ($arg_action ~* (loginForm|login|write|insert|edit|update|delete)) {
set $admin_blocked "Y";
}
# ํ์ดํธ๋ฆฌ์คํธ IP ์ฒดํฌ
set $is_allowed_ip "N";
if ($remote_addr = 127.0.0.1) { set $is_allowed_ip "Y"; }
# ์ต์ข
์ฐจ๋จ ๋ก์ง
set $check_access "FREE";
if ($admin_blocked = "Y") {
set $check_access "CHECK_${is_allowed_ip}";
}
if ($check_access = "CHECK_N") {
return 403;
}---
๐ก ๊น๋น์์ ์ด์ ํ๋ง๋: Docker ํ๊ฒฝ์์๋ ์ค์ ์ ์์ ํ ๋ค docker exec nginx-web nginx -s reload ๋ช
๋ น์ด๋ก ์์ฃผ ๊ฐํธํ๊ฒ ์ค์๊ฐ ๋ฐ์์ด ๊ฐ๋ฅํฉ๋๋ค! ๐ซก
๋ค์ ํธ์์๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฅ, Tomcat 10์ ๋ํด ์์ธํ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. ๐