EC2로 Spring 레거시 배포하고 HTTPS 인증받기 (Nginx + Tomcat 연동 With Docker)
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/
위 사이트에서 도메인을 발급받았다.
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
https://ironmask43.tistory.com/24
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