클라이언트가 보고 싶은 콘텐츠를 웹 서버에 요청
→ 웹 서버는 자신이 가진 정적 콘텐츠 중에서 클라이언트가 요청한 것이 있는지 검색
→ 해당 콘텐츠를 발견하면 클라이언트에게 전달
→ 클라이언트는 자신이 요청했던 콘텐츠를 웹 서버로부터 받아 봄
→ 웹 서버는 클라이언트가 요청했던 내용을 저장 (logging)
클라이언트가 웹 서버에 동적 콘텐츠를 요청
→ 웹 서버는 요청을 애플리케이션 서버(WAS)에 전달
→ 애플리케이션 서버는 비즈니스 로직을 실행하여 동적 콘텐츠를 생성
→ (필요시 다음 단계의 DB 서버에 데이터를 요청)
→ 생성된 동적 콘텐츠를 웹 서버로 전달
→ 애플리케이션 서버는 처리 내용을 저장 (logging)
→ 웹 서버는 애플리케이션 서버에게 받은 동적 콘텐츠를 클라이언트에게 전달
→ 웹 서버도 클라이언트가 요청했던 내용을 저장 (logging)
→ 클라이언트는 처음 웹 서버에 요청했던 동적 콘텐츠를 받아 봄
클라이언트가 웹 서버에 동적 콘텐츠를 요청
→ 웹 서버는 이 요청을 애플리케이션 서버에 전달
→ 애플리케이션 서버는 비즈니스 로직을 실행하던 중 데이터가 필요함을 인지
→ 애플리케이션 서버는 DB 서버에 데이터 쿼리(Query)를 요청
→ DB 서버는 요청받은 쿼리를 실행하여 결과(데이터)를 반환 (처리 내용 logging)
→ 애플리케이션 서버는 DB에서 받은 데이터를 가공하여 동적 콘텐츠(예: HTML, JSON)를 생성
→ 생성된 콘텐츠를 웹 서버에 전달 (처리 내용 logging)
→ 웹 서버는 전달받은 콘텐츠를 클라이언트에게 제공 (처리 내용 logging)
(애플리케이션 서버 B, C가 리버스 프록시 뒤에 있다고 가정)
클라이언트가 서버에 콘텐츠를 요청 (이 요청은 리버스 프록시 서버가 받음)
→ 리버스 프록시 서버는 자신이 관리하는 여러 대의 내부 서버(B, C) 상태를 확인
→ (예: B가 바쁘면) 가장 한가한 C 서버에게 클라이언트의 요청을 전달(forwarding)
→ C 서버는 요청을 처리 (필요시 DB 조회)한 후 응답을 리버스 프록시 서버에게 반환
→ 리버스 프록시 서버가 이 응답을 최종적으로 클라이언트에게 전달
→ 클라이언트는 요청한 콘텐츠를 받아볼 수 있음
클라이언트가 이전에 요청했던 콘텐츠를 다시 요청
→ 리버스 프록시 또는 웹 서버가 요청을 받음
→ DB나 애플리케이션 서버에 요청하기 전에 캐시 서버를 먼저 확인
→ (Cache Hit) 캐시 서버에 해당 콘텐츠가 저장되어 있으면
→ DB/애플리케이션 서버를 거치지 않고 즉시 캐시에서 콘텐츠를 꺼내 응답
→ (Cache Miss) 만약 캐시에 없으면
→ 기존 방식대로 애플리케이션 서버와 DB 서버를 거쳐 콘텐츠를 가져옴
→ 이 콘텐츠를 캐시 서버에 저장하고 클라이언트에게 전달 (다음 요청을 대비)
참고) 리버스 프록시 vs. 포워드 프록시
- 포워드 프록시 (Forward Proxy): 클라이언트 쪽에 위치합니다. 클라이언트가 인터넷(예: google.com)에 접속할 때 대신 요청을 보내주는 서버입니다. (예: 회사 내부망에서 외부 인터넷에 접속할 때 보안이나 캐싱을 위해 사용)
- 리버스 프록시 (Reverse Proxy): 서버 쪽에 위치합니다. 클라이언트가 우리 서버에 접속할 때, 그 요청을 대신 받아 내부 서버로 연결해주는 서버입니다. (예: 로드 밸런싱, SSL 암호화 처리)