일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- access modifier
- doze mode
- gitemoji
- git commit 해쉬
- Android
- 에뮬레이터 에러
- git 저장소
- toastmessage
- BuildConfig
- 자바
- 탄력적 ip
- 안드로이드
- nextInt()
- git
- 안드로이드 스튜디오 에러
- error while loading state for instance 0x0 of device 'goldfish_pipe
- E212: Can't open file for writing
- AWS
- ppk to pem
- basic toast
- 도즈모드
- utf8 인코딩
- aws 리전 변경
- was server
- 코틀린 플러그인
- aws 느림
- git 안드로이드 스튜디오 연동
- nginx 한글 깨짐
- kotlin plugin
- 이클립스 코틀린
- Today
- Total
리얼라이져의 마케팅, 개발, 창업 블로그
Web 서버 동작 과정 (공부내용 정리) 본문
우리가 웹 서핑을 할때, 보통 아래와 같은 절차를 거친다.
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 등등
그리고 웹서버와 웹애플리케이션 서버를 하나의 하드웨어에서 사용하는 것보다 나눠쓰는것이 더 메모리 효율이 높아지므로, 대규모 사이트의 경우 각각의 서버를 각각의 하드웨어에 설치하고 사용하기도 한다.
여기까지 웹서버 관련 기본적인 부분의 대하여 조사한 내용입니다.
공부한 내용이 깊지 않아, 틀린 부분이 있을수 있으니, 참고 정도만 해주시고
혹시나 피드백 주실 사항이 있으시면 꼭~! 댓글로 남겨주시면 감사하겠습니다 (꾸벅)
그럼 끝~
개발자가 되기 위해 공부 중인 비전공자 학생입니다.
아직 부족하여, 부족하거나 틀린 내용이 있을수 있으니,
그부분에 대해서 생각을 댓글로 공유해주시면
감사하겠습니다.^^
'IT > 서버' 카테고리의 다른 글
Nginx 에서 PHP ,Mysql(mariadb) LEMP 설치 및 실행 하기 (0) | 2020.06.24 |
---|---|
VSCode (Visual Studio Code) 서버 sftp 연결 (0) | 2020.06.24 |
nginx 바이너리 설치 방법 정리[Centos 7 ] (0) | 2020.06.23 |
AWS 인스턴스 리전 변경하기 (0) | 2020.06.22 |
AWS 프리티어로 EC2 사용해보기 (0) | 2020.05.04 |