# Nginx ν•˜λ„€μŠ€ (Nginx Configuration Harness) ## πŸ“‹ κ°œμš” **μƒλŒ€κ²½λ‘œ 기반 Nginx μ„€μ •**으둜 PathBase 제거 ν›„ 경둜λ₯Ό μ˜¬λ°”λ₯΄κ²Œ λ§€ν•‘ν•˜λŠ” ν•˜λ„€μŠ€. --- ## 🎯 핡심 원칙 ``` 곡개 URL: https://www.taxbaik.com/ λ°±μ—”λ“œ: http://127.0.0.1:5001/ Nginx: 경둜 λ³€ν™˜ μ—†μŒ (μƒλŒ€κ²½λ‘œ κ·ΈλŒ€λ‘œ 전달) ``` --- ## πŸ“ μ„€μ • 파일 μœ„μΉ˜ ``` /etc/nginx/sites-available/taxbaik-domains.conf /etc/nginx/sites-enabled/taxbaik-domains.conf (심볼릭 링크) ``` --- ## πŸ”§ μ„€μ • ꡬ쑰 ### ν•„μˆ˜ server 블둝 ```nginx # 1. TaxBaik (HTTPS 443) server { server_name taxbaik.com www.taxbaik.com; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; location / { proxy_pass http://127.0.0.1:5001/; # 헀더 μ„€μ • (ν•„μˆ˜) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 2. HTTP β†’ HTTPS λ¦¬λ‹€μ΄λ ‰νŠΈ server { listen 80; server_name taxbaik.com www.taxbaik.com; return 301 https://$host$request_uri; } # 3. Gitea (선택사항, SSL μ—†μœΌλ©΄ HTTP만) server { server_name gitea.taxbaik.com; listen 80; # SSL μΈμ¦μ„œ μ—†μœΌλ©΄ HTTP만 location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` --- ## πŸ“Š 포트 λ§€ν•‘ κ·œμΉ™ | 도메인 | 포트 | ν”„λ‘œν† μ½œ | λ°±μ—”λ“œ 포트 | μƒνƒœ | |--------|------|---------|-----------|------| | **taxbaik.com** | 443 (HTTPS) | TLS 1.3 | 5001 (ν”„λ‘μ‹œ) | βœ… ν™œμ„± | | **taxbaik.com** | 80 (HTTP) | - | - | 301 λ¦¬λ‹€μ΄λ ‰νŠΈ | | **www.taxbaik.com** | 443 (HTTPS) | TLS 1.3 | 5001 (ν”„λ‘μ‹œ) | βœ… ν™œμ„± | | **www.taxbaik.com** | 80 (HTTP) | - | - | 301 λ¦¬λ‹€μ΄λ ‰νŠΈ | | **gitea.taxbaik.com** | 80 (HTTP) | HTTP | 3000 | βœ… ν™œμ„± | --- ## πŸš€ ν”„λ‘μ‹œ μ„€μ • (Proxy Configuration) ### proxy_pass κ·œμΉ™ **κ·œμΉ™ 1: μƒλŒ€κ²½λ‘œ μœ μ§€** ```nginx # βœ… μ˜¬λ°”λ¦„ (μŠ¬λž˜μ‹œ 있음) proxy_pass http://127.0.0.1:5001/; # κ²°κ³Ό: /taxbaik/admin/login β†’ http://127.0.0.1:5001/taxbaik/admin/login ``` **κ·œμΉ™ 2: 경둜 λ³€ν™˜ (ν•„μš”μ‹œλ§Œ)** ```nginx # βœ… 특수 경우: /v1/ β†’ /api/v1/ location /v1/ { proxy_pass http://127.0.0.1:5001/api/v1/; rewrite ^/v1/(.*)$ /api/v1/$1 break; # 이쀑 전달 λ°©μ§€ } ``` **κ·œμΉ™ 3: μ£Όμ˜μ‚¬ν•­** ```nginx # ❌ ν‹€λ¦Ό (μŠ¬λž˜μ‹œ μ—†μŒ, 경둜 이쀑 전달) proxy_pass http://127.0.0.1:5001; # κ²°κ³Ό: /admin β†’ http://127.0.0.1:5001 + /admin β†’ 이쀑 μŠ¬λž˜μ‹œ κ°€λŠ₯ # ❌ ν‹€λ¦Ό (rewrite 없이 proxy_pass만) location /api { proxy_pass http://127.0.0.1:5001/api/; } # κ²°κ³Ό: /api/users β†’ http://127.0.0.1:5001/api//users (이쀑 μŠ¬λž˜μ‹œ) ``` ### ν•„μˆ˜ 헀더 μ„€μ • ```nginx location / { # 1. HTTP 버전 μ—…κ·Έλ ˆμ΄λ“œ (HTTP/1.1둜 μœ μ§€) proxy_http_version 1.1; # 2. WebSocket 지원 (Blazor SignalR) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; # 3. 호슀트 정보 proxy_set_header Host $host; # 4. ν΄λΌμ΄μ–ΈνŠΈ IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 5. ν”„λ‘œν† μ½œ (HTTP vs HTTPS) proxy_set_header X-Forwarded-Proto $scheme; # 6. μΊμ‹œ λ°”μ΄νŒ¨μŠ€ proxy_cache_bypass $http_upgrade; # 7. νƒ€μž„μ•„μ›ƒ (길게) proxy_read_timeout 120s; } ``` --- ## πŸ”’ SSL/TLS μ„€μ • ### Let's Encrypt μΈμ¦μ„œ ```nginx server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/taxbaik.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/taxbaik.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } ``` ### λ³΄μ•ˆ 헀더 ```nginx add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; ``` --- ## ⚑ Green-Blue 배포와 Nginx ### 포트 μ „ν™˜ 원리 ``` Nginx (κ³ μ •) ↓ /etc/nginx/sites-available/taxbaik-domains.conf ↓ proxy_pass http://127.0.0.1:5001/; (μ ˆλŒ€ λ³€κ²½ν•˜μ§€ 말 것!) ↓ TaxBaik.Proxy (포트 5001) ↓ /home/kjh2064/taxbaik_port 파일 읽기 ↓ Active Port: 5003 λ˜λŠ” 5004 ↓ μ‹€μ œ μ•± (http://127.0.0.1:5003 λ˜λŠ” 5004) ``` ### μ€‘μš”: NginxλŠ” μˆ˜μ •ν•˜μ§€ μ•ŠμŒ ```bash # ❌ μ ˆλŒ€ ν•˜μ§€ 말 것: Nginx 섀정에 5003/5004 ν•˜λ“œμ½”λ”© # μ΄λ ‡κ²Œ ν•˜λ©΄ 포트 μ „ν™˜μ΄ μž‘λ™ν•˜μ§€ μ•ŠμŒ proxy_pass http://127.0.0.1:5003/; # μœ„ν—˜! # βœ… μ˜¬λ°”λ¦„: ν”„λ‘μ‹œ 포트 κ³ μ • proxy_pass http://127.0.0.1:5001/; # ν”„λ‘μ‹œκ°€ μ‹€μ œ 포트둜 ν¬μ›Œλ”© ``` --- ## πŸ” 검증 체크리슀트 ### μ„€μ • 적용 μ „ - [ ] λ°±μ—… 생성: `sudo cp /etc/nginx/sites-available/taxbaik-domains.conf ...backup` - [ ] νŽΈμ§‘κΈ°λ‘œ μˆ˜μ •: `sudo nano /etc/nginx/sites-available/taxbaik-domains.conf` - [ ] 문법 검증: `sudo nginx -t` - μ˜ˆμƒ: "syntax is ok" + "test is successful" ### μ„€μ • 적용 ν›„ - [ ] Nginx μž¬λ‘œλ“œ: `sudo systemctl reload nginx` - [ ] μƒνƒœ 확인: `sudo systemctl status nginx` - μ˜ˆμƒ: "active (running)" ### μ‹€μ œ λ™μž‘ 확인 ```bash # 1. HTTP β†’ HTTPS λ¦¬λ‹€μ΄λ ‰νŠΈ 확인 curl -I http://www.taxbaik.com/ # μ˜ˆμƒ: HTTP 301 + Location: https:// # 2. HTTPS μ ‘κ·Ό 확인 curl -I https://www.taxbaik.com/ # μ˜ˆμƒ: HTTP/2 200 # 3. 둜컬호슀트 경유 확인 curl -H "Host: www.taxbaik.com" http://127.0.0.1/ # μ˜ˆμƒ: HTML 응닡 (ν”„λ‘μ‹œ 정상) # 4. API μ—”λ“œν¬μΈνŠΈ 확인 curl https://www.taxbaik.com/api/blog?limit=1 # μ˜ˆμƒ: JSON 응닡 ``` --- ## πŸ“‹ μ„€μ • λ³€κ²½ 이λ ₯ | λ‚ μ§œ | λ³€κ²½ 사항 | 이유 | |------|---------|------| | 2026-07-08 | PathBase 제거 ν›„ μƒλŒ€κ²½λ‘œλ‘œ 톡일 | 경둜 μ •κ·œν™” | | 2026-07-08 | proxy_pass μŠ¬λž˜μ‹œ λͺ…μ‹œ | 이쀑 μŠ¬λž˜μ‹œ λ°©μ§€ | | 2026-07-08 | ν”„λ‘μ‹œ 포트 5001 κ³ μ • | Green-Blue 배포 λŒ€μ‘ | --- ## πŸ†˜ 문제 ν•΄κ²° ### 문제 1: 404 응닡 **증상:** ``` curl https://www.taxbaik.com/ # κ²°κ³Ό: HTTP 404 ``` **진단:** ```bash # 1. Nginxκ°€ μ˜¬λ°”λ₯Έ λ°±μ—”λ“œ 포트둜 ν”„λ‘μ‹±ν•˜λŠ”μ§€ 확인 curl -H "Host: www.taxbaik.com" http://127.0.0.1/ # 같은 404? β†’ λ°±μ—”λ“œ 문제 # λ‹€λ₯Έ 응닡? β†’ Nginx μ„€μ • 문제 # 2. 포트 5001 확인 ss -tlnp | grep :5001 # μ—†μŒ? β†’ TaxBaik.Proxy μ‹€ν–‰ μ•ˆ 함 # 3. ν™œμ„± 포트 확인 cat /home/kjh2064/taxbaik_port # μ˜ˆμƒ: 5003 λ˜λŠ” 5004 ``` ### 문제 2: 502 Bad Gateway **증상:** ``` Nginxκ°€ λ°±μ—”λ“œμ— μ—°κ²° λΆˆκ°€ ``` **진단:** ```bash # 1. Nginx 둜그 확인 sudo tail -50 /var/log/nginx/error.log # μ°ΎκΈ°: "upstream connect failed" # 2. ν”„λ‘μ‹œ 둜그 확인 tail -50 /home/kjh2064/taxbaik_proxy.log # 3. μ•± 포트 확인 ss -tlnp | grep :{5003,5004} # μ—†μŒ? β†’ μ•± μ‹€ν–‰ μ•ˆ 함 ``` ### 문제 3: SSL μΈμ¦μ„œ 였λ₯˜ **증상:** ``` NET::ERR_CERT_AUTHORITY_INVALID ``` **진단:** ```bash # 1. μΈμ¦μ„œ 경둜 확인 sudo ls -la /etc/letsencrypt/live/taxbaik.com/ # 파일 쑴재? β†’ OK # μ—†μŒ? β†’ certbot으둜 μƒˆ μΈμ¦μ„œ 생성 # 2. μΈμ¦μ„œ 유효 κΈ°κ°„ sudo openssl x509 -in /etc/letsencrypt/live/taxbaik.com/fullchain.pem -noout -dates # 3. Nginx μ„€μ •μ—μ„œ 경둜 확인 sudo grep "ssl_certificate" /etc/nginx/sites-available/taxbaik-domains.conf ``` --- ## πŸ“ž μ°Έκ³  - **배포 ν•˜λ„€μŠ€**: `/docs/DEPLOYMENT_HARNESS.md` - **λΉŒλ“œ 검증**: `/docs/BUILD_VALIDATION_HARNESS.md` - **배포 슀크립트**: `/deploy_gb.sh`