Springboot 배포에 Nginx 사용하는 이유(1)

HeavyJ·2023년 2월 3일
3

자바/스프링부트

목록 보기
1/17

AWS에 Springboot를 배포하는데 있어서 추가적인 웹서버를 설치할 필요가 있을까?
동작을 하는데에 있어서는 Springboot 내 WAS로도 충분히 DB 처리, 정적 파일 처리, 비즈니스 로직 처리가 가능합니다.
그렇다면 소위 Nginx 같은 웹서버를 추가로 설치해줘서 Springboot와 연결해줘야 하는 이유에는 어떤게 있을까 자료 조사를 하다가 EC2에 Nginx를 설치하기로 했습니다.

저는 총 3가지 이유로 NginX를 프로젝트에 도입합니다.

1. Reverse Proxy

클라이언트의 요청을 받아 백엔드 서버로 요청을 전달하는 것을 의미합니다.
리버스 프록시 서버(80번 포트)는 외부에서의 요청을 전달(포워딩)하고 실제 요청에 대한 작업은 내부에 있는 애플리케이션 서버(톰캣)(8080번 포트)에서 처리하게 됩니다.

왜 포트를 80으로 실행을 해야할까?
대부분 인터넷 서비스가 80번 포트로 서비스를 하고 80번 포트는 HTTP 프로토콜의 기본 포트이기 때문에 80번 포트를 사용하면 고정아이피처럼 :80을 생략하여 사용할 수 있습니다.

NginX를 사용하지 않고 terminal에서

sudo java -Dserver.port=80 -jar sbb-0.0.2.jar

을 입력하여 80번 포트로 변환하여 사용할 수 있지만 매번 루트 권한으로 실행을 해야하며 이후에 SSL을 적용하여 https 서비스를 운영할 때 어려움이 있습니다. 따라서 Nginx와 같은 웹서버를 사용하여 포트틀 변환해주는 것이 필요합니다.

먼저 ec2에 nginx를 설치해줍니다

cd /etc/nginx/sites-available/

sudo nano conCalendar

아래와 같이 입력해줍니다
server {
listen 80;
server_name localhost;

    location / {
            proxy_pass http://localhost: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;
    }

}
listen 80은 웹 서버를 80 포트로 서비스를 한다는 뜻입니다. 이 한 줄로 인해 포트 번호를 생략하여 단순 url로 요청이 가능합니다.

server_name은 proxy_pass에 있는 server_name을 지칭하므로 ip와 연결된 도메인이 없다면 localhost와 같은 이름을 설정해주면 됩니다. 도메인을 구입하였다면 localhost 대신 해당 도메인명을 적어주면 됩니다.

proxy_pass -> Nginx로 들어오는 모든 요청을 :8080으로 리다이렉트하는 역할을 합니다
proxy_set_header -> 특정 헤더값을 전달하기 위해 사용이 됩니다

cd ..
cd sites-enabled
로 들어가서

ls
sudo rm default

sudo ln -s /etc/nginx/sites-available/conCalendar

sudo systemctl restart nginx

ubuntu@ip:/etc/nginx/sites-enabled$ ls
ubuntu@ip:/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/conCalendar
ubuntu@ip:/etc/nginx/sites-enabled$ ls
conCalendar
ubuntu@ip:/etc/nginx/sites-enabled$ cat conCalendar
server {
        listen 80;
        server_name localhost;

        location / {
                proxy_pass http://localhost: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;
        }
}
ubuntu@ip:/etc/nginx/sites-enabled$ sudo systemctl restart nginx

위 과정을 거치면 80포트(생략 가능)으로도 접속이 되는 것을 확인할 수 있습니다.

2. Web Server와 Web Application Server 의 분리로 가지는 이점

익히 많은 초보 개발자들이 Web Server는 정적 컨텐츠를 제공하고 WAS는 동적 컨텐츠를 제공한다라는 개념으로 두 서버의 차이를 인지할 것입니다.
하지만 많은 업데이트를 통해 WAS의 정적 컨텐츠 처리도 성능상으로는 크게 문제가 되지 않습니다.
그러면, 그냥 WAS만 사용해도 충분하지 않나라는 생각이 들 수 있지만 여전히 웹 서버와 WAS를 분리해야 합니다.

일단 서버 부하를 방지할 수 있습니다. WAS와 웹 서버는 분리하여 서버의 부하를 방지해야 합니다. WAS는 알다시피 비즈니스 로직, DB처리 같이 무겁고 고급 프로세스를 다루게 됩니다. 여기서 WAS가 정적 컨텐츠까지 처리하게 되면 저 고급 프로세스들의 수행 속도에 영향을 주며 서버에 부하가 커지게 됩니다.
두 번째로 보안이 강화됩니다. 클라이언트가 바로 WAS에 접근하는 식으로 아키텍처를 구성하면 WAS 뒤에 있는 DB에 대한 정보를 클라이언트나 해커가 알아낼 위험이 있습니다. 따라서 웹서버와 WAS를 물리적으로 분리해서 데이터 노출을 막을 수 있습니다. 또한 SSL에 대한 암복호화 처리를 Web Server에 사용할 수 있습니다.

++
마지막으로 로드 밸린성을 사용하기 위해 Web Server를 도입합니다. 로드 밸런싱은 웹서버와 WAS를 분리하여 여러 대의 서버에 접근할 수 있고 무중단 운영을 할 수 있게 해줍니다.
로드 밸런싱과 무중단 배포에 관한 내용은 이후 포스트에서 진행하겠습니다!

profile
There are no two words in the English language more harmful than “good job”.

1개의 댓글

comment-user-thumbnail
2023년 2월 6일

proxy 역할을 하는 nginx... 백엔드 개발자로선 알아두면 정말 좋은 기술이 아닐까 합니다!

기술이 필요한 이유나, 당위성에 대해서도 잘 설명 해주신 것 같습니다.

다만, aws ec2를 사용한다고 하셨는데,

포트포워딩에도 ubuntu 명령어로 가능한 것으로 알고 있고,

aws 서비스를 이용하면, 다른 프록시를 쓰지 않고도 로드벨런싱을 할 수 있는 기능이 있다고 알고 있습니다.

그런 부분까지 인지 하고 계시면 더 좋지 않을까 합니다

답글 달기