Trang Chủ Phần mềm Varnish: chuẩn bị bị chém!

Varnish: chuẩn bị bị chém!

Mục lục:

Anonim

Khi nói đến hiệu suất trang web, Varnish là một công nghệ nóng. Với một cài đặt và cấu hình đơn giản, có thể tăng hiệu suất của bất kỳ trang web nào và phục vụ tới một triệu trang chỉ với một máy chủ riêng ảo nhỏ., Tôi sẽ chỉ cho bạn bốn cấu hình có thể giúp bạn cải thiện thời gian phản hồi của trang web của mình, cho dù bạn có phục vụ hàng trăm, hàng nghìn hoặc hàng triệu trang.

Giới thiệu về Varnish

Varnish-Cache là một trình tăng tốc Web với mục tiêu lưu trữ nội dung trang web. Đây là một dự án nguồn mở nhằm tối ưu hóa và tăng tốc truy cập vào các trang web không xâm lấn - mà không thay đổi mã - và cho phép bạn đặt tay vào trang web của mình.


Chính những người tạo ra Varnish Cache đã gọi nó là một trình tăng tốc Web, bởi vì mục tiêu chính của nó là cải thiện và tăng tốc giao diện của trang web. Varnish đạt được điều này bằng cách lưu trữ các bản sao của các trang được phục vụ bởi máy chủ Web trong bộ đệm của nó. Lần tiếp theo cùng một trang được yêu cầu, Varnish sẽ phục vụ bản sao thay vì yêu cầu trang từ máy chủ Web, dẫn đến tăng hiệu suất rất lớn.


Một trong những tính năng chính của Varnish Cache, ngoài hiệu năng của nó, là tính linh hoạt của ngôn ngữ cấu hình của nó, VCL. VCL cho phép viết các chính sách về cách xử lý các yêu cầu đến. Trong chính sách như vậy, bạn có thể quyết định nội dung nào bạn muốn phục vụ, từ nơi bạn muốn nhận nội dung và cách yêu cầu hoặc phản hồi nên được thay đổi.


Trong các ví dụ sau về cấu hình, tôi sẽ chỉ cho bạn các quy tắc VCL nào sẽ sử dụng để đạt được một số mục tiêu, từ bộ nhớ đệm đơn giản của hình ảnh và đối tượng tĩnh, đến sử dụng Varnish trong môi trường phân tán hoặc để nó hoạt động như một bộ cân bằng tải.


Tất cả các ví dụ sau đây là dành cho Varnish 3.x. Xin lưu ý rằng Varnish 2.x sử dụng các cú pháp và quy tắc khác nhau, vì vậy những ví dụ này không tương thích với phiên bản đó.


Sau đây là các trạng thái chính của Varnish, chúng ta sẽ sử dụng trong tệp cấu hình VCL:


recv

Đây là chức năng đầu tiên được gọi khi nhận được yêu cầu. Ở đây chúng ta có thể thao tác yêu cầu trước khi đi để kiểm tra xem nó có trong bộ đệm hay không. Nếu một yêu cầu không thể được đặt trong bộ đệm, máy chủ back-end mà yêu cầu sẽ được gửi cũng có thể được chọn trong giai đoạn này.


vượt qua

Chúng tôi có thể sử dụng chức năng này khi chúng tôi muốn chuyển yêu cầu đến máy chủ Web và lưu lại câu trả lời.


ống

Hàm này bỏ qua Varnish và gửi yêu cầu đến máy chủ Web.


tra cứu

Với một tra cứu, Varnish yêu cầu xác minh xem phản hồi có hiện diện và hợp lệ trong bộ đệm hay không.


lấy

Hàm này được gọi sau khi phục hồi nội dung từ mặt sau được gọi bằng cách vượt qua hoặc bỏ lỡ.

Khái niệm cơ bản: Hình ảnh bộ nhớ cache

Vì vậy, hãy nhìn vào một ví dụ về cấu hình. Trong ví dụ đầu tiên này, chúng ta sẽ chỉ lưu trữ hình ảnh và các tệp tĩnh như các tệp CSS. Cấu hình này thực sự hữu ích khi bạn không biết trang web mà bạn muốn tăng, vì vậy bạn chỉ có thể quyết định rằng tất cả hình ảnh, CSS và JavaScript đều giống nhau cho tất cả người dùng. Để phân biệt người dùng, giao thức HTTP sử dụng cookie, vì vậy chúng tôi phải loại bỏ chúng trong loại yêu cầu này để tất cả đều giống nhau cho 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;

}

Và đó là nó. Với tệp VCL này, bạn có thể dễ dàng lưu trữ nội dung tĩnh.

Tiêu chuẩn: Hình ảnh và trang Cache

Thông thường, bạn không chỉ muốn lưu trữ nội dung tĩnh trên trang web của mình mà còn muốn lưu trữ một số trang động do máy chủ Web tạo ra, nhưng điều đó giống nhau cho tất cả người dùng - hoặc ít nhất là đối với tất cả người ẩn danh của bạn người dùng. Trong giai đoạn này, bạn phải biết chọn trang nào có thể được lưu trong bộ nhớ cache và trang nào không thể.


Một ví dụ điển hình là Wordpress, một trong những hệ thống quản lý nội dung được sử dụng phổ biến nhất. Wordpress tạo các trang web động với PHP và truy vấn cơ sở dữ liệu MySQL. Điều này thật tuyệt vì bạn có thể dễ dàng cập nhật trang web của mình từ giao diện quản trị chỉ với vài cú nhấp chuột, nhưng nó cũng tốn kém về mặt tài nguyên được sử dụng. Tại sao chạy cùng một tập lệnh PHP và truy vấn MySQL mỗi khi người dùng truy cập trang chủ? Chúng tôi có thể sử dụng Varnish để lưu trữ các trang được truy cập nhiều nhất và đạt được kết quả đáng kinh ngạc.


Đây là một số quy tắc có thể hữu ích trong quá trình cài đặt 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;

}

}

Bạn có thể thấy rằng trong ví dụ này, chúng tôi lưu trữ tất cả các trang từ trang web của chúng tôi, nhưng đối với những trang có "wp- admin" hoặc "wp-login" trong url, các chuỗi là các vị trí "đặc biệt" được sử dụng để đăng nhập vào Wordpress là một quản trị viên. Do đó, chúng tôi muốn nói chuyện trực tiếp với máy chủ Web và bỏ qua bộ đệm Varnish.


Đương nhiên, nếu bạn sử dụng Drupal, Joomla hoặc một trang web tùy chỉnh, bạn phải thay đổi các quy tắc này, nhưng mục tiêu luôn giống nhau: Để gửi tất cả các trang động và bộ đệm bạn có thể gửi đến mặt sau của bạn.

Tiêu chuẩn ++: Tăng khả năng phục hồi của máy chủ

Đôi khi các máy chủ Web trở nên chậm vì chúng có tải cao. Varnish có thể giúp với điều này quá. Chúng ta có thể sử dụng một số chỉ thị đặc biệt để nói với Varnish để tránh nói chuyện với mặt sau nếu nó bị hỏng hoặc đang trả lời quá chậm. Đối với những trường hợp này, Varnish sử dụng chỉ thị "ân sủng".


Ân điển trong phạm vi của Varnish có nghĩa là cung cấp các đối tượng đã hết hạn khi hoàn cảnh yêu cầu. Điều này có thể xảy ra vì:

  • Giám đốc back-end được chọn là xuống
  • Một chủ đề khác đã đưa ra yêu cầu cho phần cuối chưa hoàn thành.
Cả hai trường hợp đều được xử lý như nhau trong VCL:

sub vcl_recv {

if (req.backend.healthy) {

set req.grace = 30s;

} else {

set req.grace = 1h;

}

}


sub vcl_fetch {

set beresp.grace = 1h;

}

Cấu hình này yêu cầu Varnish kiểm tra mặt sau và tăng thời gian gia hạn nếu nó có một số vấn đề. Ví dụ trên cũng giới thiệu chỉ thị "req.backend.healthy", được sử dụng để kiểm tra mặt sau. Điều này thực sự hữu ích khi bạn có nhiều back end, vì vậy hãy xem một ví dụ nâng cao hơn.

Sử dụng nâng cao: Tạo một máy chủ web có khả năng phục hồi trong môi trường phân tán

Đây là tập tin cấu hình cuối cùng của chúng tôi với tất cả các tùy chọn mà chúng tôi đã thấy cho đến nay và định nghĩa của hai đầu cuối với một số chỉ thị đặc biệt cho đầu dò. Đây là cách Varnish xác định xem máy chủ Web có còn sống hay không.


.url

Varnish sẽ đưa ra yêu cầu ở mặt sau với URL này.


.hết giờ

Xác định đầu dò phải kết thúc nhanh như thế nào. Bạn phải chỉ định đơn vị thời gian với một số, chẳng hạn như "0, 1 s", "1230 ms" hoặc thậm chí "1 h".


.

Bao lâu để chờ đợi giữa các cuộc thăm dò. Bạn phải chỉ định một đơn vị thời gian ở đây cũng có. Lưu ý rằng đây không phải là "tỷ lệ" mà là "khoảng". Tỷ lệ thăm dò thấp nhất là (.timeout + .interval).


.owow

Có bao nhiêu cuộc thăm dò mới nhất để xem xét khi xác định xem phần cuối có khỏe mạnh hay không.


.thr ngưỡng

Có bao nhiêu cuộc thăm dò cuối cùng. Tốt nhất phải tốt cho phần cuối được tuyên bố là lành mạnh.


Bây giờ chúng ta có thể sử dụng lệnh "req.backend.healthy" và nhận kết quả Boolean cho chúng ta biết liệu (các) đầu cuối còn sống hay không.

#

# 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;

}

Một công cụ mạnh mẽ

Đây chỉ là một số ví dụ có thể giúp bạn bắt đầu sử dụng Varnish. Công cụ này thực sự mạnh mẽ và có thể giúp bạn đạt được hiệu suất tuyệt vời mà không cần mua thêm phần cứng hoặc máy ảo. Đối với nhiều quản trị viên trang web, đó là một lợi ích thực sự.

Varnish: chuẩn bị bị chém!