우당탕탕

Nginx 리버스 프록시에 SSL 직접 적용해보면서 겪은 이야기 본문

Linux

Nginx 리버스 프록시에 SSL 직접 적용해보면서 겪은 이야기

모찌모찝 2026. 6. 19. 15:04

제가 Nginx로 리버스 프록시 설정하면서 SSL을 붙이는 작업을 직접 해봤는데요, 생각보다 삽질이 꽤 있었어요. 특히 처음에 SSL, 리버스 프록시 이런 단어들이 너무 낯설고 어렵게 느껴지더라고요. 저도 처음엔 이게 뭔지 몰라서 한참 헤맸습니다.

그래서 이 글에서는 Nginx 리버스 프록시에 SSL을 단계별로 어떻게 적용하는지, 제가 겪었던 문제들과 해결법까지 구체적으로 정리해봤어요. 서버 인프라 초보자도 쉽게 따라할 수 있게 최대한 자세히 썼으니 끝까지 읽으면 분명 도움이 될 거예요.

개발 환경 / 버전 정보

저는 Ubuntu 22.04 환경에서 Nginx 1.22.0을 사용했고, SSL 인증서는 무료 인증서인 Let's Encrypt에서 발급받았습니다.

리버스 프록시와 SSL, 이게 뭔지부터 짚고 시작해요

사실 이 부분이 많이 헷갈리실 텐데요, 리버스 프록시는 간단히 말하면 클라이언트(내 브라우저)와 실제 서비스 서버 사이에서 중간자 역할을 해주는 서버예요. 서버 주소를 숨기거나 부하 분산, 보안 강화 목적으로 많이 씁니다.

그리고 SSL은 데이터를 암호화해서 인터넷을 통해 안전하게 주고받도록 만드는 기술이에요. 흔히 주소창에 https:// 붙는 것 있잖아요? 그게 SSL이 적용됐다는 뜻입니다.

그래서 Nginx 리버스 프록시에 SSL을 적용한다는 건, Nginx가 중간에서 서비스 서버 대신 요청을 받고 거기에 https 보안 연결까지 붙인다는 의미예요.

1단계: Nginx 설치하고 기본 리버스 프록시 설정하기

일단 Nginx가 설치돼 있어야 하는데, 저는 아래 명령어로 깔아봤어요.

sudo apt update
sudo apt install nginx -y

설치 후 systemctl status nginx로 실행 상태 확인하세요.

리버스 프록시 설정은 Nginx 설정파일(보통 /etc/nginx/sites-available/default)을 수정해요. 저는 내부 서비스가 8080포트로 돌아가고 있어서 이렇게 했습니다.

server {
    listen 80;
    server_name example.com www.example.com;  # 여러분 도메인으로 바꾸세요

    location / {
        proxy_pass http://localhost: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;
    }
}

이렇게 저장 후 sudo nginx -t로 문법 검사를 하고, sudo systemctl reload nginx로 재시작하면 기본 리버스 프록시가 완성돼요.

2단계: 무료 SSL 인증서 발급받기 (Let's Encrypt)

사실 여기서부터 막힌 분들 많을 것 같은데요, 저는 Certbot 도구를 사용해서 Let's Encrypt 인증서를 쉽게 받았어요.

먼저 Certbot 설치부터 진행해야 하는데, Ubuntu 기준으로는 아래 순서로 했습니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

설치가 되면 Nginx 설정에 맞춰 인증서를 발급 및 설정해주는 명령어를 실행해요.

sudo certbot --nginx -d example.com -d www.example.com

이 명령어 실행하면 이메일 입력, 약관 동의 같은 절차가 나와요. 거기서 안내대로 진행하면 인증서가 발급되고 자동으로 Nginx 설정에 SSL 적용이 됩니다.

3단계: SSL 적용 후 설정 파일 확인 및 자동 갱신 설정하기

발급이 잘 되었는지 /etc/nginx/sites-available/default 파일을 열어보면 listen 443 ssl; 같은 구문이 추가되어 있어요.

설정 예시는 아래와 같습니다.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;  # 80 포트 접속 시 HTTPS로 리다이렉트
}

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

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://localhost: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;
    }
}

마지막으로 Certbot 인증서는 90일짜리라서 자동 갱신 설정이 꼭 필요해요. Certbot 설치 시 기본으로 systemd 타이머가 등록되지만, 나는 직접 테스트해보고 싶을 때 아래 명령어로 수동 갱신 시도할 수 있습니다.

sudo certbot renew --dry-run

4단계: 제가 여기서 막혔던 부분과 해결법

이 단계부터가 진짜 실제 해보니 어렵더라고요. 특히 SSL 인증서 발급 중에 에러가 많이 났는데, 대표적인 문제는 아래 두 가지였어요.

  • 포트 80, 443이 열려있지 않은 경우: 인증서 발급 시 Let's Encrypt 서버가 내 서버에 접속해서 도메인 소유를 확인하는데, 80 혹은 443 포트가 막혀 있으면 실패합니다. 그래서 sudo ufw allow 80, sudo ufw allow 443 처럼 방화벽 열어줘야 했어요.
  • 도메인 DNS가 올바르게 안 잡힌 경우: 제가 처음에 example.com 도메인 A 레코드가 서버 IP로 제대로 연결 안 돼 있어서 인증서 발급이 계속 실패했어요. DNS 변경 후에도 최대 1시간 이상 기다려야 반영되니 참고하세요.

아래는 제가 실제로 받았던 인증서 발급 실패 메시지인데, 이런 경우는 보통 방화벽이나 DNS 문제일 가능성이 높습니다.

Challenge failed for domain example.com
http-01 challenge for example.com
Cleaning up challenges
Some challenges have failed.

5단계: 고급 팁, HTTPS 성능과 보안 조금 더 챙기기

사실 SSL 붙이고 나면 기본적인 https 통신은 이뤄지는데요, 여기서 더 신경쓰면 좋은 부분들이 있습니다. 저도 나중에 찾아보고 적용한 내용이에요.

  • HTTP/2 활성화 : Nginx 설정에 listen 443 ssl http2; 이렇게 써주면 속도 향상에 도움이 됩니다.
  • 강력한 SSL 설정: 중간자 공격 방지용으로 아래 같은 옵션을 조금씩 튜닝할 수 있어요.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;

이런 설정은 보통 보안 관련 사이트나 문서 참고하면서 조절하는 게 좋아요. 저는 Mozilla SSL Configuration Generator를 많이 활용했습니다.

자주 물어보시는 것들

Q. Nginx를 재시작할 때 꼭 reload만 써야 하나요?

A. 꼭 그렇진 않아요. reload는 설정을 바꾼 후 서비스 중단 없이 새 설정으로 바꾸는 거고, restart는 완전히 껐다 켜는 거라서 조금 더 위험할 수 있어요. 가급적이면 sudo nginx -t로 문법 검사 후 reload를 권장합니다.

Q. SSL 인증서 만료 전에 자동으로 갱신되나요?

A. Certbot 설치 시 자동 갱신 타이머가 기본 등록됩니다. 다만 꼭 sudo certbot renew --dry-run로 테스트해보세요. 만약 수동 갱신이 필요하면 같은 명령어로 갱신하고 Nginx를 reload하면 됩니다.

Q. 리버스 프록시 뒤에 여러 서비스가 있을 땐 어떻게 설정하나요?

A. location 블록을 여러 개 만들어 각각 다른 백엔드로 proxy_pass를 지정해주면 됩니다. 예를 들면 /app1 요청은 localhost:8081, /app2 요청은 localhost:8082로 보내는 식이죠.

이렇게 Nginx 리버스 프록시에 SSL을 적용하는 과정은 단계별로 차근차근 하다 보면 생각보다 어렵지 않아요. 저도 처음엔 뭐부터 해야 할지 몰라 한참 헤맸는데, 이제는 꽤 익숙해졌답니다. 서버 보안이 중요해지는 요즘, 이 방법으로 여러분 서비스도 한층 안전하게 운영하시길 바랍니다.

Comments