본문 바로가기

Server

Web Server & Web Application Server 그리고 Reverse Proxy

 

Web Server, Web Application Server를 알아보고,
Nginx에서 reverse proxy 설정해보기

 

Spring Boot 애플리케이션 jar 파일을 실행하면서 의문이 들었습니다.
Tomcat이 Nginx랑 다른건 뭐지?

 

chatGPT의 답변

 

 

 

Web Server, Web Application Server부터 뭐가 다른지 살펴보았습니다.

(이 둘에 대한 글은 정말 잘 정리되어있는 글들이 많으니, 검색 후 몇 개 읽어보는게 좋을 것 같습니다. )

 

 

https://code-lab1.tistory.com/199

https://story.pxd.co.kr/1647

https://www.bluebash.co/blog/web-server-vs-application-server/

 

 

저도 몇 개 읽어보고 간단하게 정리를 해보겠습니다.

 


 

💫 Web Server & Web Application Server

 

 

Web Server: 정적 컨텐츠를 제공하는 서버 (HTML, CSS, JS, 이미지, 파일 등)

  • NginX, Apache
  • 클라이언트로부터 HTTP 요청 처리 및 요청된 웹 컨텐츠(HTML, CSS, JS, 이미지, 파일 등) 제공
  • 주요 기능: 정적 컨텐츠 제공, HTTP 요청 처리, HTTPS 보안 연결 관리, load balancing (서버 과부하 방지), 캐싱

 

 

Web Application Server: 동적 컨텐츠를 제공하는 서버 (DB 연동, 사용자 인증, 로직 처리 등)

  • Tomcat
  • 웹 애플리케이션 실행, 동적 콘텐츠 처리, 비즈니스 로직 관리
  • 주요 기능: 동적 컨텐츠 제공, 코드 로드 및 관리, 세션 관리 및 사용자 인증 상태 유지, 동시성 관리, 오류 처리 및 로깅

 

 

아래는 둘의 차이점을 정리한 표입니다.

출처: https://www.openlogic.com/blog/web-server-vs-application-server#web-server-vs-application-server-key-differences

 

 

 

웹 서비스가 가질 수 있는 구조는 아래와 같습니다.

  • 클라이언트 ➡︎ 웹 서버
  • 클라이언트 ➡︎ 웹 애플리케이션 서버 ➡︎ DB
  • 클라이언트 ➡︎ 웹 서버 ➡︎ 웹 애플리케이션 서버 ➡︎ DB

 

 

 

이때, WAS(웹 애플리케이션 서버)는 동적 컨텐츠는 물론 정적 컨텐츠 처리하는데 문제가 없습니다.

그렇다면 WAS만 사용하면 되는 것 아닐까..?

웹 서버는 왜 존재하는가...?

 

 

이는 WAS가 동적 컨텐츠에만 집중할 수 있는 구조가 효율적이기 때문입니다.

정적 컨텐츠는 웹 서버가 담당할 때, 서버의 과부하를 방지하며 수행속도 또한 더 빠릅니다.

 

출처: https://code-lab1.tistory.com/199

  • 클라이언트 ➡︎ 웹 서버 ➡︎ 웹 애플리케이션 서버 ➡︎ DB

그래서 위와 같은 웹 애플리케이션 서버의 구조가 효율적이라고 합니다.

 


 

그럼 클라이언트 ➡︎ 웹서버 ➡︎ 웹 애플리케이션 서버를 어떻게 구현할 수 있을까요?

 

이를 위해선 리버스 프록시(Reverse Proxy)에 대해 알아야 합니다.

(추가로 이 글을 읽어보면 좋을 것 같습니다.)

 

💫  Reverse Proxy

 

 

리버스 프록시는 클라이언트 요청을 받아 다른 서버로 전달하는 중간 서버입니다.

이때 웹서버가 리버스 프록시를 통해 클라이언트와 웹애플리케이션 사이 중개자 역할을 합니다.

Nginx와 Apache는 리버스 프록시로 많이 사용됩니다.

  • 주요 기능: load balancing, 보안 강화, 캐싱, 콘텐츠 압축(네트워크 대역폭 절약)

 

 

이제 리버스 프록시가 뭔지 알았으니,

Nginx에서 reverse proxy 설정해봅시다

(실습은 이 글을 보며 진행했습니다.)

 

 

나는 AWS EC2 Ubuntu 22.04 환경에서 진행했습니다.

nginx 설치와 방화벽 설정까지 끝낸 상태라면

 

 

nginx.conf 수정

 

  • nginx.conf 파일 열기
sudo nano /etc/nginx/nginx.conf
  • proxy_pass 추가하기
http {
    ...
    server {
        ...
        location / {
                proxy_pass http://localhost:8080;
       }
    }
}

 

 

proxy_pass : 들어온 요청을 어디로 포워딩할 지 지정

 

나는 Spring Boot application의 포트인 8080으로 설정했습니다.

 

 

+ 추가 다른 옵션들 (공식문서는 이 곳)

 

proxy_set_header Host $host : Host 헤더를 $host 로 설정

proxy_set_header X-REAL-IP $remote_addr : 클라이언트의 실제 IP 주소를 'X-REAL-IP' 헤더로 전달

 

➡︎ 웹 애플리케이션 서버가 헤더 값 알 수 있음

 

proxy_buffers 16 4k : 요청 당 4KB 버퍼 16개 할당

 

➡︎ 버퍼의 크기 및 개수 조절

 

 

  • nginx 설정 파일 문제 없는지 확인
nginx -t
  • 문제 없으면 restart
systemctl restart nginx

 

 

리버스 프록시 설정 끝!

 


 

이상한 점이나 피드백한 것 있다면 알려주세요~

완전 환영합니다🐨