[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 reload

1. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(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์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ