요즘 서버를 구현하는데 있어서 기본지식의 부족함을 느꼈다. 개념 하나를 몰라서 찾아보면 또 모르는 개념이 나오고 이게 반복되다보니 무지함을 많이 느껴서
앞으로 모르는 것이 나올때마다 하나씩 포스팅하려고한다.
일단 클라이언트와 서버 개념부터 잡고 간다. 많이 들어봤고, 대충 알지만 정확하게 익히는게 좋을 것 같아서다.
웹 클라이언트와 서버.
1) 클라이언트와 서버
기본적으로 클라이언트와 서버는 웹 브라우저에서 특정 페이지를 요청하면 웹 서버는 해당 페이지를 반환해주는 역할을 한다. 초창기 웹이 출현했을 때는
논문 열람 사이트와 같은 정적인 웹 페이지들을 하이퍼링크로 연결하는 것이 전부였기에 위의 구조가 유행했었다.
하지만 점차 사용자가 늘어나자, DB를 통해 여러 데이터를 입력하고 조회할 수 있는 기능과 동적 페이지에 대한 필요성이 대두되었고, 새로운 서버 모델이 필요하게 되었다.
2) 정적 페이지와 동적 페이지
그렇다면 정적 페이지와 동적 페이지는 도대체 차이가 뭘까? 두 페이지의 차이는 페이지를 요청한 사용자의 정보와 현재 시점에 따라 내용이 변한다는 것이다. 우선 정적 페이지에 대해 알아보자.
정적 페이지는 서버에 미리 저장되어 있으며, 주로 HTML, CSS, Javascript, 이미지만으로 이루어져 있다. 사용자가 페이지를 요구하면 서버는 해당 정적 페이지를 반환해주는 역할만 한다.
정적 페이지로 웹 페이지를 제작했다고 했을 때, 해당 페이지는 누가, 언제 열람하더라도 같은 내용이 유지된 상태로 사용자에게 보여진다. 물론 Javascript를 통해 글자의 색 파란색으로 바꾼다던가, Building의 정보를 411로 바꾸는 등 사이트를 동적으로 제어하더라도, 이는 사전에 정의된 동작으로 인해 결국 모든 사용자에게 같은 정보를 제공하므로 정적 페이지다.
그에 반면 동적 페이지는 사용자가 페이지를 요청할 시, DB로부터 얻은 해당 사용자의 정보나 현재 시점 정보 등을 가공하여 새롭게 생성한 페이지를 말한다. 페이스북 사이트를 예로 보겠다.
로그인 하지 않은 경우, 위와 같은 화면이 나온다.
로그인을 하게되면 사용자마다 모두 다른 게시물이 나오는 것을 알 수 있다.
CGI
위에서 설명한 동적 페이지를 사용자에게 제공하기 위해 웹 서버 내에 프로그래밍 기능이 들어가는 방식을 CGI라고 한다.
하지만 CGI 방식의 경우 웹 서버에서 각각의 클라이언트 요청에 대해 독립적인 별도의 프로세스를 생성해 요청을 처리하므로, 시스템에 부하가 커져 문제가 발생하게 된다.
웹 어플리케이션 서버
1) 개념
CGI 방식의 문제점을 해결하기 위해 나타난 것이 웹 어플리케이션 서버이다. 웹 어플리케이션 서버는 웹 서버와 DB 서버 사이에서 미들웨어로서, DB 연동 및 동적 페이지를 생성하기 위한 처리를 한다.
요즘은 웹 어플리케이션 서버에서도 웹 서버의 기능을 제공하는 경우가 많다. 그렇다면 이제는 웹 서버가 굳이 필요할까? 라는 의문이 들 수도 있는데, 실제로 웹 서버의 경우 단순 이미지나 html파일 등의 리소스로 이루어진 정적 페이지를 보다 빠르고 안정적으로 사용자에게 제공할 수 있다.
그 외에도, 캐시 기능, 프록시 기능 등을 비롯해 접속 가능한 클라이언트 수 제한 및 처리 프로세스 관리, 요청 및 응답 로그 기록, 안정성 확보를 위한 인증 제어 및 암호화 처리 등의 기능을 제공하기에 지금도 많은 사이트들이 두 서버를 같이 사용한다.
2) 실제 서버 구조
현재 Node.js와 더불어 가장 핫한 웹 프레임워크 중 하나인 Django의 실제 서버 구조는 다음과 같이 구성되어 있다.
-웹 서버 Nginx는 정적 데이터 반환과 함께 리버스 프록시, 캐시 기능 등을 제공하며, 동적 데이터 처리 시에는 웹 어플리케이션에 브라우저 요청을 전달한다.
-웹 어플리케이션 서버에서 실행중인 웹 어플리케이션 Django는 MariaDB와 연동하여 데이터를 처리한 뒤, 템플릿을 렌더링해 생성한 HTML 파일을 브라우저에 반환한다.
-WSGI 미들웨어의 한 종류인 Gunicorn은 Nginx와 Django가 통신하기 위한 인터페이스 역할을 한다.