[Nginx] EC2에서 Nginx, HTTPS 설정하기

지원·2026년 1월 16일

DevOps

목록 보기
2/2

Reverse Proxy

클라이언트와 백엔드 서버 사이에 위치하여 클라이언트의 요청을 대신 받아 백엔드 서버로 전달하고 응답을 다시 클라이언트에게 돌려주는 중간 서버 역할

General Server vs Server with Nginx

리버스 프록시의 장점

  1. 보안 강화: 백엔드 서버의 실제 IP와 포트를 외부에 노출 시키지 않음.
  2. SSL/TLS 종료: HTTPS 암호화/복호화를 프록시에서 처리하여 백엔드 서버 부담 감소
  3. 로드 밸런싱: 여러 백엔드 서버로 트래픽 분산 가능
  4. 캐싱: 정적 컨텐츠 캐싱으로 성능 향상
  5. 단일 진입점: 여러 서비스를 하나의 도메인으로 통합 (CORS 해결)

EC2에 HTTPS 설정하기

사전 준비 사항

  • EC2 Instance (Ubuntu)
  • Domain Address
  • 도메인의 DNS A 레코드가 EC2의 Public IP를 가리키도록 설정
    	> DNS A 레코드 : 도메인 <-> IPv4 주소로 매칭해주는 가장 기본적인 DNS 레코드
  • EC2 보안 그룹에서 80, 443 포트 인바운드 허용

1. NGINX 설치

sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx

# 부팅 시, 자동 시작 설정
sudo systemctl enable nginx
sudo systemctl status nginx

2. NGINX 기본 설정(HTTP)

먼저 HTTP로 리버스 프록시를 설정하고 테스트합니다.

sudo vi /etc/nginx/sites-available/<project-name>

# 설정파일 내용
server {
	listen 80;
    server_name <domain-address> # 실제 도메인
    
    location / {
    	proxy_pass http://localhost:8080; # Spring Boot 실행 포트 입력하기
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwared-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

# 심볼릭 링크 생성하여 설정 활성화
sudo ln -s /etc/nginx/sites-available/<project-name> /etc/nginx/sites-enabled/

# 기본 설정 비활성화 (선택사항)
sudo rm /etc/nginx/sites-enabled/default

# 설정파일 문법 검사
sudo nginx -t

# NGINX 재시작
sudo systemctl restart nginx

3. HTTPS 설정 (Certbot 사용)

Certbot 설치

Certbot을 이용하여 SSL 인증서를 발급 받고 HTTPS를 설정해보겠습니다.

# certbot 설치
sudo apt install certbot python3-certbot-nginx -y

# SSL 인증서 발급 및 자동 설정
sudo certbot --nginx -d <domain-address>

실행 시, 다음 정보를 입력하게 됩니다.
1) 이메일 주소: 인증서 만료 알림 수신용
2) 서비스 약관 동의: Y 입력
3) HTTP -> HTTPS 리다이렉트 설정: 2 선택

자동 생성된 NGINX 설정 확인

Certbot이 설정 파일을 자동으로 수정합니다.

sudo cat /etc/nginx/sites-available/<project-name>

# life-manager 설정
server {
	server_name <domain-address>;

	# 루트 경로 - 상태 메세지 반환
	location = / {
		return 200 '{"status":"UP","service":"Life Manager API"}';
		add_header Content-Type application/json;
	}

	location /api/ {
		proxy_pass http://localhost:8080;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		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;
		proxy_cache_bypass $http_upgrade;
	}

	listen 443 ssl;
	ssl_certificate /etc/letsencrypt/live/<domain-address>/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/<domain-address>/privkey.pem;
	include /etc/letsencrypt/options-ssl-nginx.conf;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
	if ($host = <domain-address>) {
		return 301 https://$host$request_uri;
	}

	listen 80;
	server_name <domain-address>;
	return 404;
}

인증서 자동 갱신 설정

Let's Encrypt 인증서는 90일마다 만료됩니다. Certbot은 자동으로 갱신 타이머를 설정합니다.

# 자동 갱신 타이머 상태 확인
sudo systemctl status certbot.timer

# 갱신 테스트 (실제 갱신하지 않고 시뮬레이션 하는거임)
sudo certbot renew --dry-run

설정 테스트

sudo nginx -t
sudo systemctl restart nginx

curl -I https://<domain-address>

(번외) 알아두면 유용한 명령어 모음

사실 내가 까먹을거 같아서 적음😂

# nginx 관련
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx

# 로그 확인
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# 인증서 관련
sudo certbot certificates # 발급된 인증서 목록
sudo certbot renew		  # 인증서 갱신
sudo certbot delete		  # 인증서 삭제
profile
느려도 천천히라도 기록하는 백엔드 개발자👩🏻‍💻

0개의 댓글