AWS EC2(ubuntu) + Docker + 서버(spring boot)환경에서 Nginx, Let's Encrypt, Certbot을 이용한 SSL 구축 가이드
1. 도메인 준비 및 EC2 연결
우선 도메인 사이트에서(서브도메인 사이트X) 도메인을 할당받습니다
예시: 내도메인.한국
내도메인.한국 - 한글 무료 도메인 등록센터
한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공
xn--220b31d95hq8o.xn--3e0b707e
- 내도메인.한국 등에서 발급받고, 도메인 관리에서 A레코드에 EC2 퍼블릭 IP를 연결합니다.
- EC2 보안 그룹에서 80(HTTP), 443(HTTPS) 포트를 오픈합니다.
2. EC2에서 Let's Encrypt SSL 인증서 발급
Certbot 설치 및 인증서 발급
sudo apt update
sudo apt install certbot -y
sudo certbot certonly --standalone -d 실제도메인이름
- 인증서 파일이 /etc/letsencrypt/live/도메인이름/에 생성됩니다.
3. 리버스 프록시(Nginx)를 이용해 https 트래픽을 서버(spring)으로 라우팅
Nginx 설치 (Ubuntu 기준)
sudo apt update
sudo apt install nginx -y
Nginx 설정파일 수정
- /etc/nginx/nginx.conf 또는 /etc/nginx/sites-available/default(혹은 별도 conf 파일)에 아래와 같이 작성
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 여기에 여러 server 블록을 넣을 수 있습니다.
server {
listen 80;
server_name 도메인이름;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name 도메인이름r;
ssl_certificate /etc/letsencrypt/live/도메인이름/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인이름/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.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;
}
}
}
- Spring Boot가 호스트에서 8080포트로 실행 중이면 proxy_pass <http://localhost:8080>;으로 설정하면 됩니다.
- 만약 Spring Boot가 Docker 컨테이너에서 실행 중이라면, 컨테이너의 8080포트를 호스트의 8080포트에 바인딩(p 8080:8080)해야 합니다.
Nginx 설정 적용
sudo nginx -t # 설정 문법 검사
sudo systemctl reload nginx # 설정 적용(재시작)
4. Certbot Nginx 플러그인 관련 오류시 해결
문제 원인 요약
- Nginx 설정에서 include /etc/letsencrypt/options-ssl-nginx.conf; 구문이 있는데, 해당 파일이 없어서 Nginx 설정 테스트에 실패한 상황입니다.
- 이 파일은 Certbot이 Nginx용 SSL 보안 옵션을 자동으로 생성해주는 파일입니다.
Certbot Nginx 플러그인 설치 확인
- 아래 명령어로 플러그인이 설치되어 있는지 확인하고, 없다면 설치하세요:
sudo apt update
sudo apt install python3-certbot-nginx
1. options-ssl-nginx.conf 파일 자동 생성
플러그인 설치 후 아래 명령어를 실행하면 파일이 자동 생성될 수 있습니다:
sudo certbot --nginx
- 만약 여전히 파일이 생성되지 않으면, 위의 수동 생성 방법을 사용하세요
- 성공시 3번으로 가면 됩니다.
2. options-ssl-nginx.conf 파일 수동 생성
아래 명령어로 파일을 엽니다:
sudo vi /etc/letsencrypt/options-ssl-nginx.conf
아래 내용을 복사해 붙여넣고 저장하세요:
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
3. 권한을 설정후 적용
sudo chmod 644 /etc/letsencrypt/options-ssl-nginx.conf
설정 파일이 정상적으로 생성되었는지 확인 후:
sudo nginx -t
에러가 없다면 Nginx를 재시작 또는 reload:
sudo systemctl reload nginx
5. ssl-dhparams.pem 파일 없음 오류시 해결
- 에러 메시지의 핵심:
nginx: [emerg] BIO_new_file("/etc/letsencrypt/ssl-dhparams.pem") failed (2: No such file or directory)
- 즉, Nginx 설정에서 include /etc/letsencrypt/ssl-dhparams.pem;을 참조하는데, 해당 파일이 없어서 Nginx가 실행/테스트에 실패하는 상황입니다.
해결 방법: ssl-dhparams.pem 파일 생성
아래 명령어를 한 번만 실행하면 문제 해결됩니다.
sudo openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 2048
- 이 명령은 2048비트 Diffie-Hellman 파라미터 파일을 생성합니다.
- 생성에는 수십 초~수 분이 걸릴 수 있습니다(서버 성능에 따라 다름).
Nginx 설정 문법 검사
sudo nginx -t
Nginx 재시작(설정 적용)
sudo systemctl reload nginx
Certbot 명령 재실행(필요시)
sudo certbot --nginx
추가 체크리스트
- /etc/letsencrypt/options-ssl-nginx.conf와 /etc/letsencrypt/ssl-dhparams.pem 두 파일 모두 존재해야 Nginx SSL 설정이 정상 동작합니다.
- 위 파일들은 Certbot이 자동으로 생성하지만, 누락 시 직접 만들어도 무방합니다.
- Nginx 설정 변경 후에는 항상 sudo nginx -t로 문법 검사를 먼저 하세요.
6. 인증서 자동 갱신(cron) 설정
- 인증서 자동 갱신을 위해 crontab에 아래와 같이 등록
sudo crontab -e
- 아래 한 줄 추가(매주 월요일 0시 0분에 갱신)
0 0 * * 1 certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
Nginx가 80포트를 점유하고 있으면 갱신이 실패할 수 있으므로, 갱신 전후로 자동으로 Nginx를 멈췄다가 다시 시작합니다
7. GitHub Actions CD 연동
- Nginx가 호스트에 직접 설치되어 있다면,CD에서는 SSH로 서버에 접속해 Nginx 설정파일을 복사/덮어쓰기만 하면 됩니다.
예시:
- name: Deploy Nginx config
run: |
scp -i ${{ secrets.EC2_SSH_KEY }} ./nginx.conf ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/etc/nginx/nginx.conf
ssh -i ${{ secrets.EC2_SSH_KEY }} ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "sudo nginx -t && sudo systemctl reload nginx"
- Spring Boot는 도커 명령어로 배포, Nginx는 설정파일만 덮어쓰고 reload합니다
반응형
'Server-side 개발 & 트러블 슈팅 > AWS' 카테고리의 다른 글
[Linux] Swap memory를 이용해서 메모리 부족 해결 (aws ec2) (0) | 2025.01.25 |
---|
댓글