티스토리 뷰

미니프로젝트를 진행하다가 웹 시스템 구조를 아래 처럼 진행해야 할 것 같다는 이야기가 나왔다.

flow를 제대로 그렸는지 모르겠다.

먼저 client에서 요청이 오면 웹 서버를 거치고 그 다음 WAS를 거치면서 Redis를 사용해서 캐싱이 필요하다면 캐싱을 한다던가, 자료조회의 경우 Redis에 존재한다면 Redis에서 데이터를 가져오는 그런 흐름을 생각했다.

 

단순히 우리가 목표로 하는 챌린지에서 로드 밸런싱이 필요해서 라고만 하기엔 다른 이유가 있을 것 같았다.

 

리버스 프록시

보통 프록시를 떠올리면, 내가 특정 사이트에 접속할 때 내 아이피 대신 서버의 아이피를 보여주는 것만을 생각했다.

이렇게 사용자들이 어딘가에 접속을 할 때 프록시 서버를 거쳐 자신의 아이피를 숨기고 접속하는 것을 forward proxy라고 한다.

 

반대로 방문하는 사람들로부터 서버의 정보를 감추는 것을 reverse proxy라고 한다.

서버 내부적으로 파일이 어느 폴더에 들어있고 서비스가 몇 번 포트로 돌고 있는지를 감추는 것이다.

이것을 활용해서! 한 서버에서 여러 웹이 돌고 있다고 생각을 해 보자.

이런 상황에서 사용자들이 들어올 때 어느 주소로 사용자들이 접속을 하든 웹 서버가 먼저 확인하고 어떤곳을 찾아서 왔는지를 보고 그에 알맞는 처리를 해 주는 것이다. (예를 들어 kirin.com이네 ? 이건 왼쪽! longlong.com이네? 이건 오른쪽! 이런 식으로)

 

로드밸런싱

다수의 인스턴스로 서비스를 돌리고 이를 웹 서버로 잘 밸런싱 해 주는 것을 말한다.

이렇게 되면 사용자들이 한 서버에 몰리지 않게 분산처리가 되어 서버의 부하를 막을 수 있다.

 

또한 한 서비스에 서버를 두 개를 두는 경우가 있다. 이것은 지속성을 위함이다.

예를 들어 kirin.com이라는 곳에서 업데이트가 생겼다. 만일 하나의 서버에서 이 서비스가 작동하고 있었다면 

아무리 업데이트가 빨라도 사용자는 업데이트가 진행되는 동안 에러를 마주할 가능성이 생긴다.

 

이런일이 발생하지 않도록 하나의 서버에서 업데이트가 진행될 때, 다른 서버에서 업데이트가 진행될 수 있도록 하는 것이다.

중간 정리

보안이나 운영에 유리한 웹서버가 클라이언트에서 넘어오는 요청을 먼저 처리하고, WAS는 뒤에서 동적인 요소들을 만들어내는 데 (서비스 로직) 더 집중하는 것이라고 생각하자!

 

웹서버는 어떤 것을 사용해야?

웹서버라고 하면 보통 아파치와 NginX를 생각한다.

(당연히 다른 것들도 있다. 하지만 보통 주로 쓰이는 것을 생각했을때!)

 

이 둘은 작동 방식에 있어 근본적인 차이가 있다고 한다.

아파치는 다중 프로세스, NginX는 이벤트로 일을 처리한다.

 

아파치는 MPM 멀티 프로세스 모듈 방식으로 일을 처리한다. 

요청이 올 때마다 프로세스를 새로 생성하는 방식이 있고(mpm_prefork)
한 프로세스 안에서 스레드를 새로 생성하는 방식이 있다.(mpm_worker)

 

이걸 일상 생활에 빗대어 설명하면,

손님이 올때마다 테이블을 안내해주는 게 mpm_prefork

손님 여럿을 하나의 테이블에 앉히고 응대하는 오마카세가 mpm_worker라고 할 수 있다.

다만 이렇게 되면 하나의 일을 마치고 다른 일로 넘어갔을때

(실생활 예시를 생각했을 때에는 A손님 요청이 끝나고 B손님 요청으로 넘어갈때)

 

컨텍스트 스위칭 비용이 발생한다.

컨텍스트 스위칭 비용은 하나의 요청을 처리하고 다음 요청으로 넘어갈 때 발생하는 비용을 말한다. 

컴퓨터의 리소스를 많이 잡아먹는 단점이 있는 것이다.

 

반면에 NginX는 eventDriven 방식을 사용한다. 요청을 쭉 세워두고 오는대로 일을 처리하는 것과 같은 방식이다.

이는 컴퓨터의 부담이 덜해져 성능상으로 더 이점을 가지고 있다.

 

정리했을때, 성능과 가벼움을 중요하게 생각하는 서비스라면 NginX, 다양하고 검증된 기능을 필요로 한다면 아파치를 사용하는 게 좋다고 한다(오랫동안 써 왔고 그만큼 안정적일 테니까).

 

출처: 얄팍한 코딩사전 https://www.yalco.kr/44_ws_was/

'web' 카테고리의 다른 글

간단하게만 적용해보는 AWS ELB  (0) 2023.02.10
ec2 ubuntu 서버에 Prometheus / Grafana 설치  (0) 2023.02.09
[WIP 230113]멀티 스레드  (0) 2023.01.13
댓글