네트워크 공부를 하다가 Varnish라는 서비스에 대해 알게 되었다.
한국어로 된 자료는 하나도 없다고 봐도 무방했고 영어로 된 자료는 그나마 좀 찾아볼 수 있어서 내가 이해한 내용을 바탕으로 글을 쓰고자 한다.
What is Varnish?
https://varnish-cache.org/index.html (varnaish official)
varnish cache 는 c언어 기반으로 개발된 오픈소스 프로젝트이다.
https://github.com/varnishcache/varnish-cache (github)
varnish는 웹 서버나 내용이 많은(로딩이 오래걸리는) 동적 웹사이트, API를 위해 설계된 HTTP에만 특화된 HTTP 가속기이다.(출처: 위키백과)
위키백과, 페북, 레딧, 틱톡, 트위터등의 웹사이트에 사용되었다고 한다.
varnish를 역방향 프록시라고 부르기도 한다.
| 정방향 프록시 | 역방향 프록시 |
|---|---|
| 클라이언트의 앞단에 위치하여 origin server가 해당 특정 클라이언트와 직접 통신하지 못하도록 한다. | origin server 앞단에 위치하여 어떤 클라이언트도 origin server와 직접 통신하지 못하도록 한다. |
Reverse Proxy (역방향 프록시)
Load Balancing (LB: 부하 분산)
여러 서버를 운용하는 경우에 한 서버에 클라이언트의 요청이 과도하게 집중되는 것을 방지한다. (include GSLB - global server KB)
공격으로부터 보호
Origin server의 IP주소가 공개되지 않기 때문에 target attack이 불가능한 수준으로 된다.
Casching
same with common Proxy
SSL Encryption ( - 이해는 가지만 정확한 동작 원리는 더 공부해야겠다)
Clinet와 Server가 통신하는 과정에서 SSL/TLS 통신을 할텐데 이 과정에서 origin server가 직접 encode/decode를 하면 부하가 생기므로 해당 작업을 역방향 프록시가 맡는다.
Rate limmit
memory management
caching protocol storage
module
Varnish의 작동 방식
varnish가 단독으로 동작할 때는 80번(http) 포트로 수신한다.
varnish는 한 청크의 virtual memory를 미리 할당하고 할당된 청크에 객체를 지정한다.
객체에는 HTTP 응답 헤더와 백엔드에서 받는 payload가 포함되어 있다.
varnish는 많은 양의 request들을 처리하기 위해 pthreads(POSIX Threads)를 사용한다 .
pthreads와 virtual memory을 이용하는 방식은 큰 성능 향상을 가져오는데, 이상적인 경우 약 1000배의 성능향상이 기대된다.
varnish는 VCL(Varnish Configuration Language)를 사용해 캐시의 동작을 제어한다. VCL의 유연성은 타의 추종을 불허하는 특성인데,
DDoS공격에서 만약 명확한 패턴이 있다면 간단한 코드를 통해 varnish는 해당 공격을 쉽게 방어할 수 있다. 그렇기에 VCL은 varnish가 다른 caching tech보다 경쟁력을 가지는 가장 큰 특징이다.
VCL은 개발자가 varnish실행흐름의 특정 측면에만 hook할수 있게 제한한다.
The hooks는 varnish의 특정 흐름을 나타내는데, 이 단계에서 behavior of varnish는 다양한 built-in subroutines(내장 서브루틴)를 통해 표현된다. VCL파일에서 서브루틴을 정의하고 해당 서브루틴에서 caching behavior를 확장하고(새로운 코드에 대한 behavior 수정/추가), 해당 동작을 활성화하기위해 VCL파일을 다시 로드한다.
모든 서브루틴에는 흐름의 상태변화를 나타내는 정해진 양식의 return문이 있다.
만약 이 return문을 명시적으로 정의하지 않으면(정해진 양식을 지키지 않으면), VCL코드는 유효하지 않게 되어 varnish는 기본값인 built-in varnish로 동작하게된다.
Built-in VCL을 사용하는 것도 나쁘지 않은 옵션이지만 만약 필요에 따라 varnish를 custom해야 하는 경우엔 이미 좋고 다양한 VCL탬플릿들이 배포되고 있기 때문에 참조하면 도움이 많이될 것 같다.
cdn은 단순히 edge node에 캐싱해두는 것의 완벽한 예일 뿐이고 reverse caching proxy의 일부에 지나지 않는다.
많은 회사들이 유저들의 서비스의 경험을 좋게하기위해 cdn을 사용하는데 단순히 캐싱용도로만 사용하고 지리적 분산용도로는 사용하지 않는다. cost절감엔 도움이 되지만 사실 이런 비즈니스 구성은 사실 위협에 상대적으로 무방비한 상태라고 볼 수 있다.

참고
출처와 참고문헌을 게시하는 과정에서 흥미로운 사실을 알았는데
위키백과의 url을 단순 복사하여 https://ko.wikipedia.org/wiki/바니시_(소프트웨어) 이런식으로 게시하면 끝에 괄호가 인식되지않아서? 잘못된 링크로 이동되는데 괄호를 하나 더 써주면 해당 문제가 해결된다.

참고한 내용은 아니지만 구글링하다보니 몇몇 포스트를 찾았는데 참고하면 좋을 것 같아서 첨부한다.
https://jonnung.dev/system/2020/03/18/increasing-varnish-cache-hit-rate/
https://d2.naver.com/helloworld/352076