- SSH (22번 포트): 관리자 IP
- HTTP (80번 포트): 0.0.0.0/0
- HTTPS (443번 포트): 0.0.0.0/0
- 애플리케이션 포트 (8080): 필요한 IP 대역
서버 초기 설정을 위한 명령어입니다:
# 시스템 업데이트
sudo yum update -y
# 서울 타임존 설정
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
Docker 설치 및 기본 설정:
# Docker 설치
sudo yum install -y docker
# Docker 서비스 시작
sudo systemctl start docker
# 시스템 재시작시 자동 시작 설정
sudo systemctl enable docker
# 현재 사용자에게 docker 권한 부여
sudo usermod -aG docker $USER
# 권한 적용을 위해 재접속
exit
프로젝트 루트 디렉토리에 다음 내용으로 Dockerfile을 생성합니다:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
불필요한 파일이 이미지에 포함되는 것을 방지합니다:
.git
.gradle
.idea
build
!build/libs/*.jar
# 로컬에서 EC2로 JAR 파일 복사
# Windows의 경우
scp -i "C:\Users\사용자이름\Downloads\키페어이름.pem" \
프로젝트경로/build/libs/*.jar \
ec2-user@ec2-xx-xx-xx-xx.region.compute.amazonaws.com:/home/ec2-user/app
# Linux/Mac의 경우
scp -i "~/.ssh/키페어이름.pem" \
./build/libs/*.jar \
ec2-user@ec2-xx-xx-xx-xx.region.compute.amazonaws.com:/home/ec2-user/app
# EC2 접속
ssh -i "키페어.pem" ec2-user@EC2_IP
# Docker 이미지 빌드 및 실행
cd app
docker build -t springapp .
docker run -d -p 8080:8080 --name springapp springapp
# 로컬에서 실행
docker build -t 사용자명/springapp .
docker push 사용자명/springapp
# EC2에서 실행
docker pull 사용자명/springapp
docker run -d -p 8080:8080 --name springapp 사용자명/springapp
# 컨테이너 상태 확인
docker ps -a
# 컨테이너 로그 확인
docker logs springapp
# 컨테이너 중지/시작/재시작
docker stop springapp
docker start springapp
docker restart springapp
docker run -d \
--restart unless-stopped \
-p 8080:8080 \
--name springapp \
springapp
이상으로 EC2에 Docker를 사용하여 스프링 부트 애플리케이션을 배포하는 방법에 대해 알아보았습니다. 실제 운영 환경에서는 위 내용을 기반으로 하되, 보안, 가용성, 확장성 등을 추가로 고려하여 구성하시기 바랍니다.
# Nginx 설치
sudo yum install nginx -y
# Nginx 시작
sudo systemctl start nginx
# 시스템 부팅시 자동 시작 설정
sudo systemctl enable nginx
# Nginx 상태 확인
sudo systemctl status nginx
기본 설정 파일 위치: /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/app.conf 파일 생성:
server {
listen 80;
server_name your_domain.com;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log;
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;
}
}
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
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
# Nginx 재시작
sudo systemctl restart nginx
# 설정 리로드 (무중단)
sudo nginx -s reload
# 로그 확인
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
# Worker 프로세스 설정
worker_processes auto;
worker_rlimit_nofile 65535;
# Keepalive 설정
keepalive_timeout 65;
keepalive_requests 100;
# Gzip 압축 설정
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/javascript
application/json
application/x-javascript
application/xml
text/css
text/javascript
text/plain
text/xml;
# 버퍼 크기 설정
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
# 타임아웃 설정
client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;