study

Nginx에서 Let’s Encrypt로 HTTPS 적용하고, Ingress로 트래픽 넘기기

ideas9710 2025. 7. 2. 17:54
반응형
[root@master13 ~]# cat /etc/nginx/sites-available/eunbie.site

#  HTTP 요청은 HTTPS로 리디렉션
server {
    listen 80;
    server_name eunbie.site;
    return 301 https://$host$request_uri;
}

#  HTTPS 요청 처리 → Ingress NodePort로 프록시
server {
    listen 443 ssl;
    server_name eunbie.site;

    ssl_certificate /etc/letsencrypt/live/eunbie.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/eunbie.site/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:30080;  # Ingress의 80번 NodePort
        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;
    }
}

 

1. 구성 파일 위치와 목적

  • /etc/nginx/sites-available/eunbie.site
    Nginx 웹 서버가 eunbie.site라는 도메인으로 들어오는 요청을 어떻게 처리할지 정하는 설정 파일이에요.

2. 현재 적용된 설정은 아래 두 개!

✅ (1) HTTP 요청은 HTTPS로 리디렉션

server {
    listen 80;
    server_name eunbie.site;
    return 301 https://$host$request_uri;
}
  • 역할:
    1. 사용자가 **http://eunbie.site**로 접속하면,
    2. 자동으로 https://eunbie.site로 보내줍니다 (즉, 보안 연결(HTTPS)로 강제 이동!)
  • 비유:
    • "일반문(80번 문)으로 오면, 보안문(443번 문)으로 다시 안내!"
  • **HTTP(80)**은 암호화가 없고, **HTTPS(443)**은 암호화된 접속을 사용합니다.

✅ (2) HTTPS 요청은 Ingress(NodePort)로 전달 (Reverse Proxy)

server {
    listen 443 ssl;
    server_name eunbie.site;

    ssl_certificate /etc/letsencrypt/live/eunbie.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/eunbie.site/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:30080;  # Ingress의 80번 NodePort
        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;
    }
}

각 항목 설명

  • listen 443 ssl;
    • 443번(HTTPS) 포트에서 암호화 통신(SSL)을 받겠다!
  • server_name eunbie.site;
    • 도메인 이름이 eunbie.site인 요청만 해당 설정이 적용.
  • SSL 인증서 경로
    • ssl_certificate: 인증서 파일 경로
    • ssl_certificate_key: 인증서 키 파일 경로
      Let's Encrypt에서 발급한 SSL 인증서를 사용함.
  • location / { ... }
    • 모든 경로(/로 시작하는 모든 요청)에 대해 아래 설정을 적용.
  • proxy_pass http://127.0.0.1:30080;
    • 실제 처리는 로컬 호스트(127.0.0.1)의 30080 포트로 전달합니다.
    • 여기서 30080 포트는 Kubernetes Ingress의 NodePort로,
      Ingress가 받은 요청을 다시 클러스터 내부 서비스(React, Node.js 등)로 분배합니다.
  • proxy_set_header ...
    • 프록시(중간 서버)로서,
      **원래의 요청 정보(도메인, 클라이언트 IP 등)**를 뒷단에 전달하도록 세팅

🚦 전체 동작 흐름

  1. 사용자가 브라우저에 eunbie.site 입력 (http/https 구분 없음)
  2. **http://eunbie.sitehttps://eunbie.site**로 자동 리디렉션
  3. https://eunbie.site 접속
  4. Nginx가 SSL 인증서로 암호화 처리
  5. 모든 경로 요청을 127.0.0.1:30080(=Ingress NodePort)로 프록시 전송
  6. Ingress가 다시 요청 경로를 분석해서, React/Node.js로 분배

💡 이 구조를 왜 쓰나요?

  • Let's Encrypt로 직접 인증서를 발급받아,
    SSL 처리를 OS 레벨 Nginx가 전담합니다.
  • Kubernetes Ingress는 외부에서 바로 접근이 어려우므로,
    Nginx가 ‘문지기’가 되어, HTTPS 처리를 한 뒤 Ingress로 요청을 넘겨줍니다.
  • 이 구조는 Kubernetes + Nginx + HTTPS 보안을 동시에 만족하는
    실무에서 많이 사용하는 방식입니다.

쉽게 요약

  • 80번(HTTP)으로 들어온 모든 방문자 → 443번(HTTPS)로 보냄 (강제 보안)
  • 443번(HTTPS)으로 들어오면,
    Nginx가 먼저 암호화 해제 → Ingress로 요청을 넘겨줌
    (Ingress는 NodePort로 열려 있어야 하고, 127.0.0.1:30080 등 포트를 사용)
반응형