리얼라이져의 마케팅, 개발, 창업 블로그

Web 서버 동작 과정 (공부내용 정리) 본문

IT/서버

Web 서버 동작 과정 (공부내용 정리)

nadadhl 2019. 6. 5. 20:52
728x90

우리가 웹 서핑을 할때,  보통  아래와 같은  절차를   거친다.

 

1.  웹브라우저를   실행한다.

 

2.  웹브라우저 위  주소 창에 들어가고 싶은  웹페이지의   주소(url)을  적는다 

 

3.  Enter !

 

4.  위의 절차가 끝나면,  웹브라우져에는  우리가 적은 주소의  웹페이지가   땋!   하고 나타난다.

 

 

 

그렇다면,  이 웹페이지는 어디서 오는것이며, 

누가  내  요청에 맞는 웹페이지를  골라 내 웹브라우져에  올려주는 것일까???

 

 

우리가 웹브라우져에서 들어가고 싶은 웹페이지의 주소를 쳤을때, 

그 요청은  해당  웹페이지를 가지고 있는 서버로 연결된다.

(서버도  어렵게 생각할 필요없이 하나의 컴퓨터라고 생각하면 된다.)

 

그 요청이  서버 컴퓨터로  가지면  해당 서버 컴퓨터의  웹 서버라는 프로그램(소프트웨어)은 

서버 컴퓨터에 저장되어있는  웹페이지 파일 중  요청과 맞는  파일을  골라  다시  우리  웹브라우져로  넘겨준다.

이때  이 주고 받는 과정들은 http 규약에 따라 진행된다.

(아래 그림 참조)

 

하지만,  위의  구조로는   우리가 원하는  모든 웹페이지를 받아볼수 가 없다.

 

웹페이지는  두가지로 분류될수 있는데,   하나는  정적페이지고  또하나는  동적 페이지다.

 

 

정적페이지란?

 

웹브라우저 (클라이언트)  요청에 항상  같은 내용을  표시하는  웹페이지이다. 

개발자에 의해  사전에 미리  준비되어  서버에  저장된   웹페이지며,  html, css 더 나아가 javascript등으로만 

구성되어있는 페이지이다.

->  ex)  누가  언제  들어가던 항상  똑같은 내용이 담긴 간단한  회사소개 페이지

 

 

웹  초창기에는  정적 페이지에대한  수요만 있던 시절이  있었지만, 

시간이 지나면서  동적인 웹페이지를 원하는 수요들이 나타나기 시작했다.

 

 

동적 페이지란?

 

요청하는  클라이언트마다   그 클라이언트, 요청시간, 어떤 방식의 요청에 따라 

각각  다른 내용이 표시되는 웹페이지이다.

-> 즉  기존에 저장된 내용의  웹페이지가 아닌 클라이언트 요청시 만들어지는 웹페이지이다.

ex) 로그인 정보를 가져온  웹페이지,   쇼핑몰 사이트 장바구니,  게시판  등등.....

 

 

 

 

위와 같은  동적페이지를   제공하기 위해선  해당

클라이언트에게만 제공되는 정보를  저장한  데이터베이스 (DB)의 연동이 필요하게되었다.

 

하지만,  웹서버의  경우는  위와 같이  정적페이지만  처리 할수 있어서   별도의   동적페이지를   처리해줄수 있는  

소프트웨어 프로그램이  필요했다.

 

그렇게  등장하게 된것이  CGI프로그램이다.

 

 

이 프로그램들은  C, C++, PERL, PHP, PYTHON 등의  언어로  만들어졌었다. 

이 프로그램은   DB관련 로직을 처리하고  동적페이지를  만들어  웹서버에게  넘겨주었다.

 

 

이때,  이  CGI프로그램과  웹서버가   정보를 주고 받는  규칙을  정의한  것이 CGI  규격이다.

 

CGI는  common gateway  interface의 약자이다.

즉 인터페이스라는 것인데, 인터페이스의  예를 들어 보자면,

 

일상생활에서 볼수 있는  컨센트 가 있다.  컨센트의 경우,  220v를  보내주며,  이곳에는  220v를 사용하는 가전제품을  꽃을  경우만, 정상적으로 작동하게 된다.

 

220v라는 규격만 맞추면  자유롭게  어떤 것이든  사용할수 있다는 말이다.

 

이 같이 cgi 프로그램도  cgi  규격을 따라서  제작한다면,  어떤것이던 상관 없다는 말이다.  그래서  여러  언어의 프로그램들이  나올수 있었다.

 

cgi 프로그램으로  동적페이지를  처리하는  구조를 그림으로 나타내면 아래와 같다.

그런데   전통적인  CGI 방식에서 문제가 있었는데,   동적 처리를  진행할때마다  개별  독립적인 프로세스를 생성하는 방식이어서  요청이  많아질 경우,  프로세스 수가  증가해서   서버 컴퓨터의 메모리 요구량이  커지게되고  시스템 부하 현상이  일어나게됨.

 

이런  이유 땜에  현재는  cgi기술을  많이  사용안하고,   여러  대안 기술들이  등장하게된다.

 

 

 

 

대안기술중 하나는  스크립트 엔진을 활용한  방법이다.

 

cgi  프로그램 같이   동적 처리를  할수 있는  응용프로그램을   perl, php 등의  스크립트 언어로  작성한다.

그리고  웹서버 안에는  모듈 형식으로   각  스크립트를  해석할수 있는  스크립트 엔진(인터프리터)를  설치한다.

 

ex)  아파치  웹서버에서   mod_perl   또는  mod_php 모듈  등이  설치된것을  볼수 있다.

 

cgi 방식의 단점이었던 요청시마다  새로운 프로세스를  만들어내는  과정을  하나의 프로세스를  실행후  요청마다  쓰레드 동작 형식으로  처리하게 되었다.

 

 

 

또 다른  대안 기술로는   데몬 프로그램을  활용한  방법이있다.

 

데몬(deamon) 이란??
윈도우에서는   서비스와 같은 기능을 함.
일반  process는  실행 상태  들어가  일련의 명령을  수행하고, 명령이 끝나면  process가 소멸되지만,
demon 프로세스는 명령이 끝나도 소멸되지않ㅎ고,  메모리상에  상주하면서 특정 조건이 되면 다시 명령을 수행한다.

 

 

동적 처리할때  진행되는  응용프로그램(cgi 프로그램)  프로세스를 미리  데몬으로 가동시켜 놓은 후 , 

요청을 데몬에서 처리한다.

 

 

이  방식에서  점차   기술이 발전하여,  스레드 처리가  보강되고  객체지향 기술이 반영되면서 

응용프로그램 전용 데몬인  애플리케이션 서버 (was) 방식으로  발전 하였다고 한다.

 

 

 

애플리케션 서버란??

 

 

동적처리를 하는  응용프로그램들을  따로 실행할수 있는  서버를  만들어  사용하는 방식이다.

클라이언트가  동적 페이지를 요청하였을때,  웹서버는 요청을 받아  애플리케이션 서버에게  처리를 위임한다.

그리고 애플리케이션 서버는  동적처리를 해주는 프로그램들을 실행시켜  db로부터  원하는 결과를  처리한 후,

다시  웹서버에게 넘겨주고 웹서버는 클라이언트에게 결과를 보여준다.

 

아래는 위의  처리과정의 그림이다.

 

 

그렇다면,  애플리케이션 서버가 그냥 웹서버의 역할도 하면 되지 않을까??

 

서버를 두개로  분리한 이유는 서로의 역할을  구분하여 사용하는것이 좋기 때문이다.

정적페이지에 비해 동적페이지를 처리하는 경우,  수배에서 수십배의  메모리를 소비하기 때문에

역할을 나눠서   웹서버는 정적페이지를  처리하고 애플리케이션 서버는  동적페이지를 처리하는 것이

더 효율적일수 있다.

 

오늘날  두 서버는  점점더 각  처리 환경에   전문화되는 방향으로 발전 하고 있으며,

 

 

웹서버는 -> 정적페이지 제공,  캐시기능,   프록시기능 , http/https의 제어에 필요한 여라가지 기능등   추가적인 기능을 제공한다.

 

웹 애플리케이션 서버는 웹서버와의  연동  규격을  잘 따르기만 하면,  임의의  언어 플랫폼 사용이 가능하여 ,   많은  종류의  웹 애플리케이션 서버가 생겨났다

ex) 자바 -> tomcat,   루비 -> unicon,  파이썬  uwsgi 등등

 

그리고  웹서버와 웹애플리케이션 서버를  하나의  하드웨어에서  사용하는 것보다 나눠쓰는것이  더  메모리 효율이  높아지므로,   대규모 사이트의 경우   각각의 서버를  각각의  하드웨어에 설치하고  사용하기도 한다.

 

 

 

 

 

여기까지  웹서버 관련   기본적인 부분의 대하여  조사한  내용입니다.

 

공부한 내용이  깊지 않아,   틀린 부분이 있을수 있으니,   참고 정도만 해주시고

혹시나   피드백 주실 사항이 있으시면  꼭~!  댓글로  남겨주시면 감사하겠습니다 (꾸벅)

 

 

그럼 끝~

 

개발자가 되기 위해  공부 중인  비전공자  학생입니다. 
아직 부족하여,  부족하거나  틀린 내용이 있을수 있으니, 
그부분에 대해서  생각을  댓글로 공유해주시면 

감사하겠습니다.^^
Comments