티스토리 뷰
회사에서 어드민 서버를 신규 인프라로 이전하게 됐다. 베이스에서부터 작업하다보니 이전하면서 서버의 구조에 대해 볼 일이 생겼다. 우리 회사에서 사용하는 어드민의 서버 구조는 웹서버와 WAS를 연동시킨 구조였다.
대충 위와 같은 구조이고, 앞라인에 L4 로드밸런서를 둬서 로드밸런싱을 하고 있다.
L4 부분까진 정확히 알 수 없으니, Httpd 웹서버와 Tomcat을 연동하면서 기억하고 싶었던 내용을 정리하려고한다. 그리고 위 내용을 정리하기 전에 웹서버와 WAS의 내용을 정리하지 않고 지나갈 수가 없었다..
1. 웹서버(Web Server)
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램 - 위키백과
위키백과의 정의와 같이 웹서버는 HTTP 요청을 받아들여 "정적 컨텐츠"를 사용자에게 반환하는 역할을 한다. 여기서 "정적 컨텐츠"란 일반적인 그림 및 영상 파일 뿐만 아니라 자바스크립트, CSS가 포함된 HTML페이지를 이야기한다.
단순히 정적인 컨텐츠만을 사용자에게 반환하는 역할을 하는게 아니라 로드 밸런싱 등 WAS와 연결고리 역할을 해주기도 하는데 이 부분이 이 글을 쓰게 된 동기이다.
대표적으로 Apache Httpd Server와 Nginx가 있으며, 이 두 개가 웹서버계를 양분하고 있다.
둘의 장단점도 또 정리를 해야할 내용이다...
2. WAS(Web Application Server)
웹 애플리케이션 서버(Web Application Server, 약자 WAS)는 웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크이다. 인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어(소프트웨어 엔진)로 볼 수 있다. 웹 애플리케이션 서버는 동적 서버 콘텐츠를 수행하는 것으로 일반적인 웹 서버와 구별이 되며, 주로 데이터베이스 서버와 같이 수행이 된다. - 위키백과
일반적으로 웹서버가 단독으로 처리할 수 없는 부분인 서비스 로직과 DB CRUD 등 "동적 컨텐츠" 부분을 담당한다. 어렵게 생각할 것 없이 사용자가 요청하는 정보를 DB와 연동하여 처리해, 해당 결과를 다시 알려주는 역할을 담당한다.
표현이 조금 어려운데 WAS의 역할은 DB 데이터를 사용자에게 바로 노출시킬수 없기 때문에 사용자로부터 요청받아 DB에 접근하고, 그 데이터를 정제해서 사용자에게 뿌려주는 역할이다.
대표적으로 Apache Tomcat이 있다. 다른 미들웨어 엔진들도 있지만 대부분 생소한 것들이다.
3. 왜 단일 구조를 사용하지 않는가?
사실 이 부분이 제일 의문점을 갖기 쉬운 부분이다.
근래의 서버 미들웨어들은 단일 기능만 갖고 있지 않다. 동적/정적 컨텐츠를 모두 다룰 수 있게 기능을 제공하고, 컴퓨팅 파워 또한 무리 없이 설정할 수 있다.
그럼에도 불구하고 하나의 미들웨어에게 다양한 역할을 맡기지 않는데는 생각보다 많은 이유가 있다.
- 과부하 방지. 사이즈가 큰 정적 데이터를 요청할 경우, 단일 서버는 병목현상을 자주 겪는다. 위에서 언급한 것과 같이 정적 데이터는 WEB서버에 요청 & 일반 API는 WAS에 요청하여 나눠서 운영해 과부하를 방지한다.
- 보안적인 부분. 실제 웹 어플리케이션이 동작은 WAS에서 담당한다. 이 부분을 외부에 노출 시키지 않기 위함도 존재한다. 실제 DB와 연동하는 로직과 설정들은 WAS에 있기 때문에 더 숨길 필요가 있다.
- 장애극복기능. 일반적으로 Failover라고 부른다. 단일 서버로 서비스를 운영하다가 서버가 죽어버리면 서비스 전체가 마비되는 상황에 놓이기 때문에, 이를 피하기 위해서 여러대의 웹서버와 WAS를 두고 사용한다. WAS 한대가 죽더라도 무중단 운영이 가능하다.
- 로드밸런싱. 1절에서 언급했듯이 WEB서버도 로드밸런싱 역할을 할 수도 있다.
내가 모르는 것 외에도 다양한 이유가 있을 수 있으나 아는 선에서 최대한 정리해보았다. 개념을 알아봤으니 실제는 어떻게 연결하는지 configuration 파일을 열어보면서 정리해볼 에정이다.
'개발 > 인프라' 카테고리의 다른 글
Harbor : Private Container Registry 설치하기 (1) | 2023.03.15 |
---|---|
AWS EC2에서 Jenkins 자동배포 구축하기 (1) (1) | 2023.01.26 |
Docker 정리 (0) | 2023.01.26 |
VM(Virtual Machine)과 Docker (1) | 2023.01.26 |
캐시(Cache)와 CDN(Content Delivery Networks) (0) | 2023.01.16 |
- Total
- Today
- Yesterday
- Elastic cloud
- OpenFeign
- elasticsearch
- springboot
- 오블완
- CloudFront
- AWS EC2
- Kotlin
- java
- terraform
- EKS
- AOP
- S3
- ChatGPT
- lambda
- 후쿠오카
- Spring
- openAI API
- 티스토리챌린지
- GIT
- serverless
- 람다
- 스프링부트
- JWT
- AWS
- docker
- Log
- OpenAI
- cache
- MySQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |