프로그래밍/Network 10

간단하게 살펴보는 HTTP의 진화과정

HTTP/1.0 HTTP/1.0에서는 클라이언트/서버간 각 요청/응답에 대해 새로운 TCP 연결을 생성한다. 그래서 각 요청전에 TCP 및 TLS 핸드셰이크가 완료되어야 했고, 모든 요청에 대기시간 패널티가 발생했다 HTTP/1.1 한번의 TCP 연결을 유지하고자 Keep-alive가 등장했다. 하지만 HTTP/1.1에서는 클라이언트가 한 번에 하나의 HTTP 요청/응답 교환만 허용했으므로 네트워크 계층에서 동시성을 얻는 유일한 방법은 TCP 연결을 병렬로 사용하는 것인데, Pipelining을 통해 여러 요청을 전송했을때, 첫번째 요청에 대한 응답이 지연되면 뒤에 따라오는 모든 응답도 같이 지연되었는데 이를 “Head of line Blocking”이라고 한다. 이는 RFC 2616에서 서버는 반드시 ..

HTTP ETag에 대해 알아보자

ETag란? ETag란 EntityTag의 줄임말로, 웹 캐시 유효성 검증에 사용된다. 리소스의 특정 버전에대한 고유값이 ETag의 값이되고, 리소스의 내용이 업데이트되면 ETag도 바뀐다. 클라이언트에서 캐싱하고 있는 버전과 서버에서 가지고 있는 버전이 동일하다면 서버는 내용없이 304 Not Modified 라는 상태코드로만 응답을 내려주어 response body에 대한 트래픽을 아낄 수 있다. ETag 작동방식 먼저 HTTP Request를 날려보자. 서버는 ETag와 함께 응답 (상태코드 200)을 내려줄 것이다. 이 요청에 대한 응답의 사이즈는 43.9KB였다. ETag의 검사기 종류에는 약한(Weak)과 강한(Strong)검사가 있는데, 약한 검사를 하는 ETag는 W/로 시작하고, 강한 검..

NGINX 서브 도메인 설정하기 (feat.CloudFlare)

1. 서브도메인 추가하기 (CloudFlare) CloudFlare > DNS > Add record에서 서브 도메인 레코드를 추가한다. Type은 CNAME, name에 해당 서브도메인이 들어간다. test.com에 api 서브도메인을 추가하고 싶을때 설정은 다음과 같다. 2. NGINX 설정파일 작성 새로운 nginx 설정파일을 추가한다. 내용은 다음과 같다. server { listen 80; listen [::]:80; server_name api.test.com; // 서브도메인 rewrite ^ https://api.test.com/$request_uri; // https로 보내기 } server { listen 443 ssl; server_name api.test.com; // 서브도메인 s..

HTTP 연결과 커넥션 관리

연결 수립 클라이언트와 서버가 HTTP 요청/응답으로 교환하기 전 , TCP 커넥션을 설정해야한다. HTTP/1.0의 기본 동작은 각 요청/응답에 대해 별도의 TCP 커넥션을 여는 것이다. TCP를 이용할 경우, 컴퓨터 상의 HTTP 서버를 위한 기본 포트는 80이다. 요청을 위한 페이지 URL은 도메인 이름과 포트번호 둘 다를 포함하는데, 포트 번호가 80일 경우 생략가능하다. HTTP 흐름 1. TCP 커넥션을 연다. TCP 커넥션은 요청을 보내거나 응답을 받는데 사용된다. 클라이언트는 새로운 커넥션을 열거나, 기존 커넥션을 재사용하거나, 서버에 대한 여러 TCP 커넥션을 열 수 있다. 2. HTTP 메세지를 전송한다. HTTP/2 이전의 메세지는 사람이 읽을 수 있을 정도다. GET / HTTP/1..

HTTP Request/Response의 메세지 구조 뜯어보기

HTTP 메세지 HTTP 메세지는 서버와 클라이언트 간 데이터가 교환되는 방식이다. 메세지 타입은 Request와 Response가 있다. HTTP 메세지는 ASCII로 인코딩된 텍스트 정보이며 여러 줄로 되어있다. HTTP/2에와서는 최적화와 성능 향상을 위해 HTTP 프레임으로 나누어지게되었다. Request Request는 클라이언트가 서버로 전달해서 서버의 액션이 일어나게끔하는 메세지이며, 다음 요소들로 구성된다. Method: GET/POST/PUT/DELETE/OPTIONS/HEAD 등 클라이언트가 수행하고자 하는 동작이다. Path: 가져오려는 리소스의 경로다. 프로토콜, 도메인, TCP 포트를 제거한 리소스의 URL이다. Version of protocol: HTTP 프로토콜의 버전 Hea..

MIME 타입

MIME 타입은 클라이언트에게 전송된 문서의 형식을 알려주기 위한 메커니즘이다. 웹 서버는 브라우저들이 각 리소스를 내려받았을때 해야할 기본 동작이 무엇인지를 결정하는데 도움을 주기위해 올바른 MIME 타입을 제공 해주어야한다. MIME 타입 외에도 매직 넘버(Magic number)라고 하는 파일을 열면 가장 처음보이는 16진수값들로 파일 형식을 구분할 수 있기도하지만 100% 신뢰할만한 시스템은 아니다. - GIF: 47 49 46 38 - PNG: 89 50 4E 47 # 일반적인 구조 type/subtype '/'로 구분된 두개의 문자열인 타입과 서브 타입으로 구성됨. 스페이스는 허용하지 않는다. # 대표적인 타입과 서브타입 예시 타입 설명 일반적인 서브타입 예시 text 텍스트를 포함하는 모든 ..

[Nginx] 리버스 프록시로 사용하기 (백업 서버 설정, 로드 밸런싱)

Upstream Nginx를 리버스 프록시로 이용하기 위해서는 nginx의 내장 모듈 중의 하나인 upstream 모듈을 사용하면 된다. upstream 모듈은 proxy_pass등의 지시자에 의해 참조되며 nginx가 받은 요청들을 처리할 서버의 집합을 정의할 수 있다. *리버스 프록시가 무엇인가요? 가정 lou-server1.com, lou-server-2.com, lou-server-3.com이라는 3개의 서버에 각각 웹 애플리케이션이 동작하고 있다고 가정한다. upstream 지시자 바로 뒤의 'backend' 부분은 서버 집합의 그룹명이다. 나중에 proxy_pass에서 이 이름을 가지고 참조 할 수 있다. upstream 블록안에는 현재 동작중인 서버 목록이 들어가게 된다. server 지시자..

Ngnix의 개념과 작동방식 정리 (feat. Apache)

Nginx의 등장 배경: Apache 의 문제점 Apache 웹 서버에 대해서 들어본적이 있는가? 아주 어렸을때부터 수차례...(게임에 관심이 많았던 건지) 아파치 톰캣 서버 어쩌고 저쩌고를 많이 본 기억이있다. Apache는 Nginx의 등장 전 까지 가장 널리 쓰이던 웹 서버다. 웹 서버는 World Wide Web에서 만들어진 클라이언트 요청을 서비스하기위해 HTTP나 그 이외의 프로토콜(HTTPS/SMTP/FTP...)을 사용하는 SW/HW다. 하드웨어로서의 웹 서버는 웹 서버가 설치되어있는 컴퓨터를 의미하며, 소프트웨어로서의 웹 서버는 앞서말한 기능을 제공하는 컴퓨터 프로그램을 말한다. Apache, Nginx, IIS 등이 있다. 대부분은 웹 페이지 컨텐츠를 제공하는 역할을 한다. Nginx는..

[Nginx] Static 파일을 캐싱해서 웹 페이지 로딩 속도를 높이자

내가 운영하고 있는 동물의 숲 어플인 너굴리스트다. 그냥 컴퓨터에서 이용할때는 견딜만 하지만, 아이폰의 경우 웹뷰로 띄워서 보여주는데 로딩속도가 무지막지하게 느리다. 사진에서 봐도 Finish까지 15.90s. 이럴때 Nginx에서 css/js/image 파일 등을 캐싱 해 두면 좋다는 조언을 얻었다. 방법은 간단하다. nginx 설정 파일에서 자신이 사용하고 있는 location 전에 다음과 같이 또 하나의 location을 선언 해주면 된다. location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { expires 30d; add_header Vary Accept-Encoding; access_log off; } 그리고나서 nginx 설정에 문법이 틀린 것이 없는지 검사 후 재..

IP와 Subnet

IPv4: 32bit = 8bit . 8bit . 8bit . 8bit IP = 네트워크부 + 호스트부 192.168.1.119 Example) 굵은 글자가 네트워크부 / 밑줄글자가 호스트부 IP 주소는 네트워크 부와 호스트 부로 구성되어있다. 라우터는 송신지 IP의 네트워크 부 정보를 보고 목적지가 같은 네트워크에 있는지 판단한다. 어드레스 클래스(Address class) 이 네트워크부를 어디까지 할지 고정해서 정해둔것이 어드레스 클래스다. 가능한 호스트 주소 수에서 2를 빼는 이유는 모든 비트가 0인 주소와, 모든 비트가 1인 주소를 호스트 주소로 할당하지 않는 예약된 IP 주소이기 때문이다. 십진수로는 0과 255가된다. xxx.xxx.xxx.0: 네트워크 전체 의미 xxx.xxx.xxx.255:..