소프트웨어 바니시 : 슬래시 도트 준비!

바니시 : 슬래시 도트 준비!

차례:

Anonim

웹 사이트 성능과 관련하여 Varnish는 뜨거운 기술입니다. 간단한 설치 및 구성으로 모든 웹 사이트의 성능을 높이고 소규모 가상 사설 서버만으로 최대 백만 페이지를 제공 할 수 있습니다., 수백, 수천 또는 수백만 페이지를 제공하든 사이트의 응답 시간을 향상시키는 데 도움이되는 네 가지 가능한 구성을 보여 드리겠습니다.

니스 소개

Varnish-Cache는 웹 사이트 콘텐츠 캐싱을 목표로하는 웹 가속기입니다. 코드를 변경하지 않고 비 침습적으로 웹 사이트에 대한 액세스를 최적화하고 속도를 높이고 웹 사이트에 손을 넣는 것을 목표로하는 오픈 소스 프로젝트입니다.


Varnish Cache의 제작자는 웹 액셀러레이터라고 불렀습니다. 기본 목표는 웹 사이트의 프런트 엔드를 개선하고 속도를 높이는 것이기 때문입니다. Varnish는 웹 서버가 제공하는 페이지의 사본을 캐시에 저장하여이를 달성합니다. 다음에 동일한 페이지가 요청되면 Varnish는 웹 서버에서 페이지를 요청하는 대신 복사본을 제공하므로 성능이 크게 향상됩니다.


Varnish Cache의 주요 특징 중 하나는 성능 외에도 VCL의 유연성입니다. VCL을 사용하면 들어오는 요청을 처리하는 방법에 대한 정책을 작성할 수 있습니다. 이러한 정책에서는 컨텐츠를 가져올 위치와 요청 또는 응답을 변경하는 방법에서 제공 할 컨텐츠를 결정할 수 있습니다.


다음 구성 예에서는 이미지 및 정적 객체의 간단한 캐싱에서 분산 환경에서 Varnish 사용 또는로드 밸런서 역할을하는 데 이르기까지 몇 가지 목표를 달성하는 데 사용할 VCL 규칙을 보여줍니다.


다음 예제는 모두 Varnish 3.x 용입니다. Varnish 2.x는 다른 구문과 규칙을 사용하므로이 예제는 해당 버전과 호환되지 않습니다.


다음은 VCL 구성 파일에서 사용할 Varnish의 주요 상태입니다.


recv

요청을받을 때 가장 먼저 호출되는 함수입니다. 여기서 우리는 요청이 캐시에 존재하는지 확인하기 전에 요청을 조작 할 수 있습니다. 요청을 캐시에 넣을 수없는 경우이 단계에서 요청이 전송 될 백엔드 서버를 선택할 수도 있습니다.


통과하다

요청을 웹 서버에 전달하고 응답을 캐시하려는 경우이 기능을 사용할 수 있습니다.


파이프

이 기능은 Varnish를 무시하고 요청을 웹 서버로 보냅니다.


조회

조회를 통해 Varnish는 캐시에 응답이 존재하고 유효한지 확인하도록 요청합니다.


술책

이 함수는 백엔드에서 컨텐츠 복구가 패스 또는 미스에 의해 호출 된 후에 호출됩니다.

기본 사항 : 캐시 이미지

구성 예를 살펴 보겠습니다. 이 첫 번째 예에서는 이미지와 CSS 파일과 같은 정적 파일을 캐시합니다. 이 구성은 부스트하려는 웹 사이트를 모르는 경우에 매우 유용하므로 모든 이미지, CSS 및 JavaScript가 모든 사용자에 대해 동일하다고 결정할 수 있습니다. 사용자를 구별하기 위해 HTTP 프로토콜은 쿠키를 사용하므로 이러한 유형의 요청에서 쿠키를 제거하여 Varnish와 동일하도록해야합니다.

sub vcl_recv{


if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{

unset req.http.cookie;


unset req.http.Vary;

return(lookup);

}


# strip the cookie before the image is inserted into cache.

sub vcl_fetch {

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {

unset beresp.http.set-cookie;

}

그리고 그게 다야. 이 VCL 파일을 사용하면 정적 컨텐츠를 쉽게 캐시 할 수 있습니다.

표준 : 캐시 이미지 및 페이지

일반적으로 웹 사이트의 정적 내용을 캐시하고 싶지는 않지만 웹 서버에서 생성 한 일부 동적 페이지도 캐시하고 싶지만 모든 사용자에게 동일하거나 최소한 모든 익명 사용자에게 동일합니다. 사용자. 이 단계에서는 캐시 할 수있는 페이지와 캐시 할 수없는 페이지를 선택해야합니다.


가장 일반적으로 사용되는 콘텐츠 관리 시스템 중 하나 인 Wordpress가 좋은 예입니다. Wordpress는 PHP를 사용하여 웹 사이트 페이지를 동적으로 생성하고 MySQL 데이터베이스에 쿼리합니다. 몇 번의 클릭만으로 관리 인터페이스에서 웹 사이트를 쉽게 업데이트 할 수 있지만 사용되는 리소스 측면에서 비용이 많이 들기 때문에 유용합니다. 사용자가 홈페이지에 방문 할 때마다 동일한 PHP 스크립트와 MySQL 쿼리를 실행하는 이유는 무엇입니까? Varnish를 사용하여 가장 많이 방문한 페이지를 캐시하고 놀라운 결과를 얻을 수 있습니다.


다음은 Wordpress 설치에 유용 할 수있는 몇 가지 규칙입니다.

sub vcl_recv{

# Let's make sure we aren't compressing already compressed formats.

if (req.http.Accept-Encoding) {

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {

remove req.http.Accept-Encoding;

} elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

} elsif (req.http.Accept-Encoding ~ "deflate") {

set req.http.Accept-Encoding = "deflate";

} else {

remove req.http.Accept-Encoding;

}

}


if (req.url ~ "^/$") {

unset req.http.cookie;

}


# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


}


sub vcl_miss {

if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

}

if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {

unset req.http.cookie;

set req.url = regsub(req.url, "\?.$", "");

}

if (req.url ~ "^/$") {

unset req.http.cookie;

}

}

sub vcl_fetch {

if (req.url ~ "^/$") {

unset beresp.http.set-cookie;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail

if (!(req.url ~ "wp-(login| admin )")) {

unset beresp.http.set-cookie;

}

}

이 예에서는 웹 사이트의 모든 페이지를 캐시하지만 URL에 "wp-admin"또는 "wp-login"이있는 페이지의 경우 문자열은 "특별한"위치로 로그인하는 데 사용됩니다. 관리자로서 Wordpress. 따라서 웹 서버와 직접 대화하고 Varnish 캐시를 무시하고 싶습니다.


당연히 Drupal, Joomla 또는 맞춤형 웹 사이트를 사용하는 경우 이러한 규칙을 변경해야하지만 목표는 항상 동일합니다. 모든 동적 페이지와 캐시를 백엔드로 전송하려면 항상 동일합니다.

표준 ++ : 서버 탄력성 향상

때때로 웹 서버는로드가 높기 때문에 속도가 느려집니다. 광택도 도움이 될 수 있습니다. 백엔드가 다운되거나 응답이 너무 느린 경우 백엔드와의 대화를 피하도록 특수 지시문을 사용할 수 있습니다. 이러한 경우 Varnish는 "grace"지시문을 사용합니다.


광택의 범위 내에서 유예는 상황에 따라 만료 된 객체를 전달하는 것을 의미합니다. 다음과 같은 이유로 발생할 수 있습니다.

  • 선택한 백엔드 디렉터가 다운되었습니다
  • 다른 스레드가 이미 완료되지 않은 백엔드에 이미 요청했습니다.
두 경우 모두 VCL에서 동일하게 처리됩니다.

sub vcl_recv {

if (req.backend.healthy) {

set req.grace = 30s;

} else {

set req.grace = 1h;

}

}


sub vcl_fetch {

set beresp.grace = 1h;

}

이 구성은 니스에 백엔드를 테스트하고 문제가있는 경우 유예 기간을 늘리도록 지시합니다. 위의 예에서는 백엔드를 확인하는 데 사용되는 지시문 "req.backend.healthy"도 소개합니다. 이것은 백엔드가 여러 개인 경우에 매우 유용하므로 고급 예제를 살펴 보겠습니다.

고급 사용 : 분산 환경에서 탄력적 인 웹 서버 생성

이것은 우리가 지금까지 본 모든 옵션과 두 백엔드의 정의가 프로브에 대한 특수 지시문으로 정의 된 최종 구성 파일입니다. 이것은 Varnish가 웹 서버가 살아 있는지 여부를 결정하는 방법입니다.


.url

니스는이 URL을 사용하여 백엔드에 요청합니다.


.timeout

프로브를 얼마나 빨리 끝내야하는지 결정합니다. "0.1 s", "1230 ms"또는 "1 h"와 같은 숫자로 시간 단위를 지정해야합니다.


.간격

여론 조사 간 대기 시간 여기에 시간 단위도 지정해야합니다. 이것은 "속도"가 아니라 "간격"입니다. 가장 낮은 폴링 속도는 (.timeout + .interval)입니다.


.창문

백엔드가 건강한지 여부를 결정할 때 고려해야 할 최신 설문 조사 수입니다.


.문지방

백엔드가 정상으로 선언 되려면 몇 개의 .window 마지막 폴링이 양호해야합니까?


이제 지시문 "req.backend.healthy"를 사용하여 백엔드가 살아 있는지 여부를 알려주는 부울 결과를 얻을 수 있습니다.

#

# Customized VCL file for serving up a Wordpress site with multiple back-ends.

#


# Define the internal network subnet.

# These are used below to allow internal access to certain files while not

# allowing access from the public internet .

acl internal {

"10.100.0.0"/24;

}


# Define the list of our backends (web servers), they Listen on port 8080


backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}

backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}


# Define the director that determines how to distribute incoming requests.

director default_director round-robin {

{ .backend = web1; }

{ .backend = web2; }

}


# Respond to incoming requests.

sub vcl_recv {


set req.backend = default_director;

# Use anonymous, cached pages if all backends are down.

if (!req.backend.healthy) {

unset req.http.Cookie;

set req.grace = 6h;

} else {

set req.grace = 30s;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


# Always cache the following file types for all users.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

unset req.http.Cookie;

}


}


# Code determining what to do when serving items from the web servers.

sub vcl_fetch {

# Don't allow static files to set cookies.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

# beresp == Back-end response from the web server.

unset beresp.http.set-cookie;

}


# Allow items to be stale if needed.

set beresp.grace = 6h;

}

강력한 도구

다음은 Varnish 사용을 시작하는 데 도움이되는 몇 가지 예입니다. 이 도구는 실제로 강력하며 더 많은 하드웨어 나 가상 머신을 구매하지 않고도 성능을 크게 향상시킬 수 있습니다. 많은 웹 사이트 관리자에게는 이것이 큰 이점입니다.

바니시 : 슬래시 도트 준비!