Infra/AWS

EC2로 Spring 레거시 배포하고 HTTPS 인증받기 (Nginx + Tomcat 연동 With Docker)

now0204 2024. 8. 13. 15:48

 

1. 사전작업

 

-   Nginx와 Tomcat을 띄울 인스턴스 2개 

-   WAS 배포  인스턴스에 Docker가 다운받아져야함 

-   Tomcat을 띄운 인스턴스는 깃허브 연동 (깃에서 pull 받아올 것)

 

 

2. 인스턴스2에 war 배포하기

 

2.1 배포를 위한 Dockerfile 작성 (프로젝트의 루트에 이를 작성해서 저장한다 파일 이름은 Dockerfile이다)

 Dockerfile의 내용은 다음과 같다.

# 1. Maven 빌드 단계
FROM maven:3.9.8-eclipse-temurin-11 AS build

# 2. 프로젝트 소스 복사
COPY . /app

# 3. 작업 디렉토리 설정
WORKDIR /app

# 4. Maven을 사용하여 프로젝트 빌드 (테스트 생략)
RUN mvn clean package -DskipTests

# 5. Tomcat 베이스 이미지
FROM rapidfort/tomcat9-openjdk11-lb

# 6. 빌드된 WAR 파일을 Tomcat의 웹앱 디렉토리에 복사
COPY --from=build /app/target/*.war /usr/local/tomcat/webapps/ROOT.war

# 7. Tomcat 실행 (기본 설정으로 이미 ENTRYPOINT가 설정되어 있음)

 

*ROOT.war에 배포하면, context path는 자동으로 /로 배포된다.  

*jdk 버전이 달라지면 이에 맞는 태그를 사용하면 된다. 

 

2.2 git허브에서 프로젝트 받아오기 

 

먼저 소스파일을 저장할 폴더 생성 

mkdir myapp

 

git 리포지토리에서 clone 받아오기

git clone 리포지토리url .

 

2.3 Dockerfile을 통해 이미지 빌드하기 

docker build -t my-maven-web-app .

// docker build -t [빌드 후 이미지명] [dockerfile 위치]

 

2.4 빌드한 이미지로 container 띄우기 

docker run -p 8080:8080 my-maven-web-app

3. 인스턴스1에 Nginx  다운 

 

sudo apt update
sudo apt install nginx

 

http://EC2 IP주소 했을 때

 위 화면이 나오면 성공이다.


4  Cerbot으로 HTTPS 인증받고 reverse proxy 연결

 

* 원래는 가비아 혹은 Route53에서 도메인을 발급 받아야하지만, 연습을 위해 

https://xn--220b31d95hq8o.xn--3e0b707e/

 

내도메인.한국 - 한글 무료 도메인 등록센터

한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공

xn--220b31d95hq8o.xn--3e0b707e

위 사이트에서 도메인을 발급받았다.

 

4.1 도메인 발급 및 연결 

 

 

ip주소연결에 nginx가 작동중인 EC2의 ip주소를 입력해준다.

 

도메인이 연결 완료 

 

4.2 CertBot 설치

sudo snap install certbot --classic

 

4.3 인증서 발급

sudo certbot --nginx -d {도메인}

 

4.4 NGINX 설정으로 이동

#경로로 이동

cd /etc/nginx/sites-available

# 파일 권한 설정 

sudo chmod 777 default

#편집기 실행 
sudo vi defautl

 

*중간중간 폴더나 파일에 들어갈 수 없으면 sudo chmod로 권한을 설정해준다.

 

4.5 프록시 설정 

 

server_name 도메인명 #managed by certbot 부분을 찾는다. 아래에 Location을 추가한다. 

   location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 클라이언트가 프록시 처리한 모든 서버의 IP 주소 목록
                proxy_set_header X-Forwarded-Proto $scheme; #프록시 서버의 HTTP 응답이 HTTPS로 변환
                proxy_set_header X-Real-IP $remote_addr; # 실제 방문자의 원격 ip 주소
                proxy_set_header Host $http_host; # 클라이언트가 요청한 원래 호스트 주소

                proxy_pass http://{private-ip}:8080; # 프록시 해줄 서버의 EC2 IP
        }

 

4.6 NGINX 재시작

sudo systemctl restart nginx

 

 

*추가 

location / {
    #root   /usr/share/nginx/html;
    #index  index.html index.htm;
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
 }

location ~ \.(css|js|jpg|jpeg|gif|png|html)$ {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
}

location ~ \.jsp$ {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
}

 

위와 같이 url 패턴에 따라 리버스 프록시를 연결할 수도 있다.

 

첫번째는 /에 요청에 대해, 두번째는 각종 확장자에 대해, 세번째는 .jsp요청에 대해 연결한다. 

 


 

참고자료 

 

https://mrgamza.tistory.com/711

 

nginx + tomcat을 이용하여 reverse proxy 연동하기

거의 Apache + Tomcat을 이용하였는데 이제는 조금 시대가 변하고 있는것 같습니다. 한국에서도 nginx를 이용하여 tomcat을 사용하는 곳이 생기고 저희 회사도 마찬가지로 사용중입니다. ^^ 그런데 nginx

mrgamza.tistory.com

https://ironmask43.tistory.com/24

 

Chapter.08-1 : AWS EC2 서버에 프로젝트를 배포해 보자(git pull, 배포 스크립트 만들기)

"스프링부트와 AWS로 혼자 구현하는 웹 서비스" 라는 책을 바탕으로 학습목적의 프로젝트를 진행하고 있습니다. 소스 : https://github.com/ironmask431/springboot_aws_01 apter.08 : EC2 서버에 프로젝트를 배포해

ironmask43.tistory.com

https://velog.io/@bruni_23yong/Certbot%EC%9C%BC%EB%A1%9C-HTTPS%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

Certbot으로 HTTPS설정하기

HTTPS를 간단하게 적용해보았습니다!

velog.io