Nginx에 SSL 적용 및 Reverse Proxy 설정

Nginx에 SSL 적용 및 Reverse Proxy 설정

애플리케이션에 SSL 인증서를 직접 적용하는 대신 Nginx에 SSL을 설정하면, Nginx 뒤의 모든 애플리케이션에 SSL이 적용되어 매우 유용합니다. 본 문서에서는 Nginx에 SSL을 설정하고 Reverse Proxy를 구성하는 방법을 설명합니다.

환경

  • 운영 체제: Ubuntu 18 이상
  • Reverse Proxy 대상 포트:
    • 3000 (Frontend)
    • 8080 (AI 서비스)
    • 8081 (Backend)

1. SSL 인증서 파일 준비

SSL 인증서를 SSL For Free 등을 통해 발급받은 경우, 다음과 같은 3개의 파일이 제공됩니다:

  • certificate.crt
  • private.key
  • ca_bundle.crt

이 파일들을 /etc/nginx/ssl 디렉토리로 복사합니다.


2. Nginx 설정 파일 수정

2.1 백업 파일 생성

Nginx 설정 파일은 /etc/nginx/sites-available/default에 위치합니다. 변경 전에 기존 파일을 백업해 두는 것이 좋습니다:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

2.2 기본 설정 변경

Nginx는 기본적으로 /etc/nginx/sites-available 디렉토리에 있는 모든 파일을 읽습니다. 특정 파일만 읽도록 설정하려면 /etc/nginx/nginx.conf 파일을 수정해야 합니다. 하단에 위치한 다음 부분을 확인합니다:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

위 내용을 다음과 같이 수정합니다:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/default;

3. SSL 및 Reverse Proxy 설정

/etc/nginx/sites-available/default 파일을 다음과 같이 수정합니다:

server {
    listen 80;
    server_name example.com www.example.com;

    # HTTP 요청을 HTTPS로 리다이렉트
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    # SSL 인증서 경로
    ssl_certificate /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;
    ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt;

    # SSL 프로토콜 및 암호화 방식 설정
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # Reverse Proxy 설정
    location / {  # 루트 요청을 Frontend로 전달
        proxy_pass http://localhost: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;
    }

    location /ai/ {  # /ai 요청을 AI 서비스로 전달
        proxy_pass http://210.115.229.219:8080/;
        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;
    }

    location /be/ {  # /be 요청을 Backend로 전달
        proxy_pass http://localhost:8081/;
        proxy_set_header Upgrade $http_upgrade;  # WebSocket 지원
        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;
    }
}

WebSocket 지원

/be/ 경로의 WebSocket 지원을 위해 다음 설정을 추가했습니다:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

해당 프로젝트에서 WebRTC Signaling 서버가 WebSocket 프로토콜을 사용하기 때문에 필요한 설정입니다. HTTP만 사용하는 경우에는 생략할 수 있습니다.


4. 설정 확인 및 적용

Nginx 설정 파일에 오류가 없는지 확인합니다:

sudo nginx -t

오류가 없다면 Nginx를 재시작하여 변경 사항을 적용합니다:

sudo systemctl restart nginx

위와 같은 설정을 통해 Nginx를 사용한 SSL Reverse Proxy 구성을 완료할 수 있습니다.

'DevOps' 카테고리의 다른 글

[Spring Boot + MySQL] docker-compose 세팅  (1) 2024.09.02
minikube service 외부 접속 안되는 이유  (0) 2024.08.27
Jenkins CI/CD with github  (0) 2024.06.07
Docker에 nginx 컨테이너 올리기  (0) 2024.03.28