본문 바로가기
Server

aws ec2에서 Nginx + Spring boot Application 연동

by Ahngyuho 2023. 7. 23.
sudo vi hanium(filename)

진행 동기

최근 프로젝트 진행 도중 nginx Spring boot appliction의 프록시 웹서버로 둬야하는 상황이 생겼습니다. 그래서 이번에는 Nginx Spring boot application을 연동하는 방법에 대해 알아보겠습니다.

 

환경

실행 환경은 aws ec2 Linux 22.04이고, 저는 Nginx 와 Spring boot Application이 같은 서버에 존재합니다.

aws ec2에서 DB는 mysql, Java는 jdk 11을 사용했습니다. 추후에 ec2에 jar 파일 배포도 포스팅 하겠습니다.

 

Nginx 설치

Nginx는 오픈 소스 웹 서버이므로 자유롭게 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install nginx
sudo systemctl enable nginx.service

//정상작동 확인 명령어
systemctl status nginx.service

기본적인 Nginx 설치는 위와 같습니다.

 

우선 nginx 설정 파일이 모여있는 폴더로 이동해 봅시다.

cd /etc/nginx

 

 

이 폴더 안에 설정 파일을 만들어 둘 수 있습니다.

 

폴더 안에 들어가서 설정 파일까지 만들어보겠습니다.

cd sites-available
sudo vi filename

 

그리고 설정은 다음과 같이 작성해주시면 됩니다. Nginx의 module을 사용하면 설정을 자유롭게 추가/삭제 할 수 있으므로 저와 다른 설정을 원하시면 Nginx 공식 문서를 확인하셔서 module에 대해서도 공부해 보시면 좋을 듯 합니다.

전 Nginx를 단순히 프록시 서버로 두기 위해 설정한 것이므로 그 부분을 참고해주셨으면 합니다.

server{
        listen 80;
        server_name localhost;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }


}

server : 

listen : 클라이언트의 요청을 수신하기 위한 포트 http는 80포트를 사용하는 프로토콜이므로 80으로 설정

server_name : server {...} 이 블록이 응답해야 하는 도메인 이름 또는 IP

location / :  들어오는 요청을 " / " 이 경로로 매핑

proxy_pass : 매핑된 경로로 들어오는 요청을 해당  URL로 리다이렉(프로토콜은 http, https 지정 가능, 주소는 도메인 이름 또는 IP 주소,그리고 포트)

proxy_set_header 

  • X-Real-IP : 실제 요청을 한 클라이언트의 IP를 요청 주소로 설정
  • X-Forward-For : 실제 요청을 한 클라이언트의 IP를 요청 주소로 설정 X-Real-IP 와의 차이는 X-Forward-For는 일반적으로 사용되는 IP를 넣어주고, X-Real-IP는 사용자 설정 가능
  • Host : 실제 요청을 한 클라이언트의 Host 헤더로 설정

 

설정 파일 적용

그리고 이제 이 설정 파일을 적용해 보도록 하겠습니다. 

처음에는 default 라는 설정  파일이 적용되어 있는데 이를 삭제하고 직접 만든 파일로 적용해보는 것입니다.

cd /etc/nginx/sites-enabled
ls

해보시면 아마 default 라는 파일이 존재할 것입니다.

 

sudo rm default
sudo ln -s /etc/nginx/sites-available/filename
ls

그러면 이제 직접 만든 설정 파일이 존재하게 됩니다.

 

sudo systemctl restart nginx
systemctl status nginx.service

이렇게 active 되어 잘 나오면 성공입니다!

 

이제 브라우저에 ec2 ip만 넣고 요청을 불러와도여러분들의 애플리케이션 메인 화면이 나올 겁니다.

 

 

실제로는 Spring boot의 내장 톰캣에 직접 요청을 한 것이 아니라 Nginx의 80 포트로 요청을 포내고 Nginx가 Spring boot의 내장 톰캣으로 요청을 보내주는 것입니다.

그래서 이제 굳이 Spring boot의 내장 톰캣 포트로 요청을 직접 보내주지 않으셔도 됩니다.

 

다음 해볼 것

다음 해볼 것은 Spring boot 애플리케이션을 systemd에 등록하여 보려고 합니다. 

sudo systemctl start shop.service
sudo systemctl restart shop.service
sudo systemctl enable shop.service

이런식으로 서비스로 등록해서 지속적으로 사용되게끔 해보려고 합니다!