DevOps 환경에서의 Nginx 리버스 프록시 설정은 많은 개발자에게 필수적인 작업 중 하나입니다. 특히 Kubernetes 클러스터 내에서 서비스를 배포하고 운영하면서 Nginx를 활용한 리버스 프록시 설정은 효과적인 트래픽 관리와 부하 분산을 지원합니다. 하지만 이 과정에서 여러 시행착오를 겪으면서 깨달은 교훈들이 많습니다. 이번 글에서는 Nginx 리버스 프록시 설정 중 겪었던 어려움과 그로부터 얻은 통찰을 공유하고자 합니다.

Nginx 설치 및 기본 설정

Kubernetes 클러스터 내에 Nginx를 설치하기 위해 먼저 Helm을 사용하여 Nginx Ingress Controller를 배포했습니다. Helm은 Kubernetes 패키지 매니저로, 간편하게 애플리케이션을 설치하고 관리할 수 있게 도와줍니다.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Nginx Ingress Controller 설치
helm install my-nginx ingress-nginx/ingress-nginx

이렇게 설치한 후, Nginx의 기본 설정 파일을 수정하여 리버스 프록시를 적용할 수 있습니다. 초기 설정에서 가장 간단한 리버스 프록시는 아래와 같이 정의할 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

위 코드는 my-app.example.com 도메인에 들어오는 모든 요청을 my-service라는 서비스로 전달하는 간단한 예제입니다.

시행착오와 해결책

1. SSL 인증서 설정

처음에는 SSL 인증서 설정을 간과했습니다. HTTPS를 지원하지 않는 앱은 보안상 문제가 발생할 수 있습니다. Let's Encrypt와 같은 무료 SSL 인증서를 이용하면 간편하게 HTTPS 설정을 할 수 있습니다.

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-cert
spec:
  secretName: my-cert-secret
  issuerRef:
    name: my-issuer
    kind: ClusterIssuer
  commonName: my-app.example.com
  dnsNames:
  - my-app.example.com

이렇게 설정한 후, ingress 리소스에 SSL 인증서를 적용해야 합니다.

spec:
  tls:
  - hosts:
    - my-app.example.com
    secretName: my-cert-secret

SSL이 설정된 후, HTTPS를 통해 안전하게 애플리케이션에 접근할 수 있습니다.

2. 리다이렉트와 리라이트 문제

처음 리다이렉트를 설정할 때, 의도한 대로 작동하지 않아 애플리케이션의 URL이 올바르게 표시되지 않았습니다. 이 문제는 리다이렉트 및 리라이트 규칙을 명확히 이해하지 못해 발생했습니다. Nginx의 리다이렉트와 리라이트 규칙을 올바르게 설정하기 위해 다음과 같은 설정을 추가했습니다.

annotations:
  nginx.ingress.kubernetes.io/permanent-redirect: https://my-app.example.com

이 설정을 통해 HTTP 요청을 HTTPS로 영구적으로 리다이렉트할 수 있습니다.

3. 로깅과 모니터링

리버스 프록시 설정 후, 로그를 통해 문제가 발생했을 때 원인을 파악하는 것이 중요하다는 것을 깨달았습니다. Nginx의 접근 로그와 에러 로그를 활성화하여 문제를 진단하는 데 도움을 주었습니다.

nginx.ingress.kubernetes.io/access-log: "true"
nginx.ingress.kubernetes.io/error-log: "true"

이 설정을 통해 Nginx의 로그를 Kubernetes의 로깅 시스템에 통합할 수 있습니다.

마무리

Nginx에서 리버스 프록시를 설정하며 여러 시행착오를 겪으면서 많은 것을 배웠습니다. SSL 인증서 설정, 리다이렉트 처리, 그리고 로깅과 모니터링의 중요성을 깨달았습니다. 이러한 경험은 향후 DevOps 환경을 더욱 효율적으로 운영하는 데 큰 도움이 될 것입니다. Nginx를 활용한 리버스 프록시 설정은 단순한 작업이지만, 세심한 주의와 올바른 이해가 필요합니다. 이 글이 여러분의 Nginx 설정에 도움이 되기를 바랍니다.