반응형
웹서버
1. Web Basics
- 클라이언트와 서버는 텍스트 베이스인 HTTP로 통신함.
- HTTP: 매우 단순.
- 클라이언트는 서버와 인터넷 연결을 open하고 콘텐츠를 요청한다.
- 서버는 요청받은 콘텐츠에 대해 응답하고 연결을 종료한다.
- 브라우저는 콘텐츠를 읽고 화면에 띄운다.
FTP와 HTTP와의 차이?
- 가장 큰 차이는 웹 콘텐츠가 HTML 언어로 쓰여진다는 점.
- HTML 프로그램은 태그를 갖고 있는데, 이 태그는 브라우저에게 어떻게 다양한 텍스트와 그래픽 요소들을 페이지에 띄울 것인지 알려준다. 반면 FTP는 파일을 전송하는 프로토콜.
2. Web content
- 클라이언트와 서버에게
content
란 MIME type을 지닌 바이트의 연속. MIME는 파일의 유형을 나타냄.(html, gif, png, jpeg) - 웹 서버는 클라이언트에게 콘텐츠를 두 가지 방식으로 제공
- 정적 콘텐츠
- 서버 내 저장 공간에서 파일을 가져다가 그것을 클라이언트에게 반환.
- 디스크 파일은 정적 콘텐츠라고도 하며, 파일을 클라이언트에게 반환하는 프로세스를 serving static content라고 한다.
- 동적 콘텐츠
- 실행가능한 파일을 작동시키고 그것의 결과물을 클라이언트에게 제공한다. 런타임 시에 만들어지는 결과물을 동적 콘텐츠라 하며, 프로그램을 동작시키고 그 결과물을 클라이언트에게 반환하는 프로세스를 serving dynamic content라 한다.
- 정적 콘텐츠
- 웹서버로부터 반환받는 모든 콘텐츠는 파일과 연관되어 있다. 각 파일은 URL이라는 고유한 이름을 갖고 있음.
- ex) http://www.google.com:80/index.html
- 위 주소는 호스트 www.google.com에 있는
/index.html
파일을 특정짓는데, 이 파일은 웹서버가 포트 80에서 듣기 소켓을 열어두고서 관리한다.
- 위 주소는 호스트 www.google.com에 있는
- ex) http://www.google.com:80/index.html
- 실행 가능한 파일에 대한 URL은 프로그램 인자를 파일 이름 뒤에 포함한다. “?” 기호는 파일 이름과 인자를 구분짓게 한다. 각 인자는 “&” 문자로 구분할 수 있다.(인자를 추가할 수 있다는 뜻)
- ex) http://bluefish.ics.cs.cmu.edu:8000/cgi-bin/adder?15000&213
- 여기서 실행가능한 파일은 /cgi-bin/adder이며 이 adder는 15000과 213이라는 두 인자를 호출받는다.
- ex) http://bluefish.ics.cs.cmu.edu:8000/cgi-bin/adder?15000&213
- 어떻게 서버가 URL의 접미사를 이해하는지에 대한 몇 가지 방법
- URL만으로 이 요청사항으로 받게 될 콘텐츠가 정적인지 동적인지 구별하는 표준 규칙은 없음. 각 서버는 각자만의 방식으로 파일을 관리. 클래식한 접근 방식은 디렉토리 집합을 이름으로 유형화(구분). (ex-cgi-bin) ⇒ 디렉토리 이름만으로 특정지어서 모든 실행가능한 파일이 반드시 해당 디렉토리 내에 있게끔.
- *주의: suffix에 오는 가장 첫 문자인 “/”는 리눅스에서 말하는 root 디렉토리를 의미하는 것이 아님. 이는 홈 디렉토리를 말하며 콘텐츠의 유형이 무엇이든 들어있을 수 있다.
- 정적 콘텐츠 경로:
/usr/httpd/html
- 동적 콘텐츠 경로:
/usr/httpd/cgi-bin
- 정적 콘텐츠 경로:
- URL에 붙는 최소 단위 접미사는 “/’ ⇒ 모든 서버가 디폴트 홈페이지로 설정해놓음.
3. HTTP 트랜잭션
- HTTP는 텍스트 라인을 기반으로 인터넷 연결을 통해 전송하기 때문에, 우리는 리눅스 텔레넷 프로그램을 이용해인터넷 상의 어떤 웹서버와도 트랜잭션을 수행할 수 있음.
- 텔넷(TELNET): 원격 로그인 툴로써 SSH가 그 자리를 대체.
- 텔넷을 통해 AOL 웹서버 홈페이지를 요청할 때의 코드
-
1 linux> telnet [www.aol.com](http://www.aol.com) 80 2 Trying 205.188.146.23... 3 Connected to aol.com. 4 Escape character is ’^\]’. 5 GET / HTTP/1.1 6 Host: [www.aol.com](http://www.aol.com) 7 8 HTTP/1.0 200 OK 9 MIME-Version: 1.0 10 Date: Mon, 8 Jan 2010 4:59:42 GMT 11 Server: Apache-Coyote/1.1 12 Content-Type: text/html 13 Content-Length: 42092 14 15 16 ... 17 18 Connection closed by foreign host. 19 linux> Client: open connection to server Telnet prints 3 lines to the terminal Client: request line Client: required HTTP/1.1 header Client: empty line terminates headers Server: response line Server: followed by five response headers Server: expect HTML in the response body Server: expect 42,092 bytes in the response body Server: empty line terminates response headers Server: first HTML line in response body Server: 766 lines of HTML not shown Server: last HTML line in response body Server: closes connection Client: closes connection and terminates
- 리눅스 쉘에서 TELNET을 실행한 뒤 AOL 웹서버와 연결을 요청
- TELNET은 터미널에게 3줄짜리 아웃풋을 출력. 커넥션을 오픈한 다음 텍스트를 출력하고 기다림.
HTTP 요청
- HTTP 요청은 request line으로 구성
5 GET / HTTP/1.1 // request line
6 Host: www.aol.com // required HTTP/1.1 header
HTTP 응답
- HTTP 응답은 요청과 비슷. 요청은 request line으로 구성되고 0 이상의 response header가 붙는다.
- 전에 배웠던 2xx, 3xx, 4xx, 5xx 상태코드를 그때 상황에 따라 반환해서 클라이언트에게 전송,
4. Serving Dynamic content
CGI(Common gateway interface)
어떻게 Client가 프로그램 인자를 서버에게 넘겨주나?
- GET 요청에 대한 인자는 URI를 통해 들어온다.
- ?: 파일 이름과 인자를 구분
- &: 각 인자를 구분
- 스페이스는 허용되지 X ⇒ %20이라는 문자열로 스페이스가 변환됨.
서버는 어떻게 인자를 자식 프로세스에게 넘겨주나?
- 서버가 요청을 받고나면 ex) GET /cgi-bin/adder?15000&213 HTTP/1.1
- 서버는 fork 함수를 호출해 자식 프로세스를 생성한 뒤, execve 함수를 호출해 자식 프로세스 내에서 /cgi-bin/adder 프로그램을 실행한다.
- adder 와 같은 프로그램을 CGI 프로그램이라 하는데, 이는 adder 프로그램이 CGI 표준을 따르기 때문.
- execve 함수를 호출하기 전에, 자식 프로세스는 CGI 환경변수 QUERY_STRING을 15000&213으로 설정하는데, 이는 adder 프로그램이 런타임시에 참조할 수 있도록 하기 위함이다.
CGI: 웹 서버에서 동적인 페이지를 보여주기 위해 임의의 프로그램을 실행할 수 있도록 하는 기술 중 하나. 원래 웹서버는 서버에 저장되어 있는 고정된 문서를 보여주는 정적인 콘텐츠만 띄우는 역할을 했으나, 웹서버에서 정보를 찾거나 기록하려면 웹서버를 고쳐서 그런 기능을 넣어야 했다. 하지만 그럴 수 없으니, 대신 웹서버가 특정한 URL로 들어가면 요청을 원하는 프로그램에 적절히 넘겨주는 기술이 필요했는데 CGI가 그런 역할을 한다.
서버는 어떻게 다른 정보를 자식 프로세스에게 넘겨주나?
- CGI는 CGI 프로그램이 작동할 때 설정할 수 있을 것으로 예상하는 다른 환경 변수를 정의한다.
자식 프로세스는 어떻게 결과물을 보내주나?
- CGI 프로그램은 동적 콘텐츠를 표준 출력으로 보낸다. 자식 프로세스가 CGI 프로그램을 불러오고 작동시키기 전에, 자식 프로세스는 리눅스 dup2 함수를 사용해 표준 출력을 클라이언트와 연결된 연결 디스크립터로 리다이렉트한다.
- 따라서, CGI 프로그램에서 표준 출력으로 작성하는 모든 것들은 다이렉트로 클라이언트한테 간다.
- 이때, 부모 프로세스는 자식 프로세스가 만드는 콘텐츠의 타입이나 크기를 전혀 모르기 때문에, 자식 프로세스는 콘텐츠 타입과 콘텐츠 길이를 생성하는
Content-type
,Content-length
response header를 생성해줘야 한다.
반응형
'정글사관학교 개발일지 > 웹 서버' 카테고리의 다른 글
정글사관학교 52일차 TIL: tiny 서버 구현, string 관련 함수 정리 (0) | 2021.12.24 |
---|---|
정글사관학교 51일차 TIL: 프록시, mmap()과 malloc() 차이 정리 (2) | 2021.12.23 |
정글사관학교 49일차 TIL: 파일 디스크립터, 소켓 프로그래밍 (0) | 2021.12.20 |
정글사관학교 48일차 TIL: 웹브라우저 요청 흐름, HTTP (0) | 2021.12.20 |
정글사관학교 47일차 TIL: PORT, URI, 웹브라우저 요청 흐름(중요) (0) | 2021.12.18 |