Varnish Cache là gì?
Ngày đăng: 26/12/2017
Varnish là một hệ thống cache được dùng để tăng tốc server, đặc biệt là với những hệ thống lớn, có trafic nhiều. Varnish hoạt động bằng cách cache nội dung page lên bộ nhớ RAM và ngay lập tức trả lại cho người dùng khi có yêu cầu mà không phải thông qua PHP, JAVA hay MySQL xử lý.
Do sử dụng bộ nhớ RAM để cache nên tốc độ truy xuất sẽ nhanh hơn rất nhiều so với ổ đĩa truyền thống, kể cả SSD. Bạn thử tưởng tượng với những website có lượng lớn dữ liệu, phương pháp cache thông thường sẽ tạo ra hàng vạn file .html trên ổ cứng, lúc đó Apache hoặc Nginx xử lý sẽ cực kỳ vất vả, tốn tài nguyên.

Varnish hoạt động rất tốt với những website có dữ liệu lớn, một số website lớn trên thế giới đang áp dụng Varnish như Wikipedia, The New York Times, The Guardian, Facebook, Twitter, Vimeo, …

Các bước cài đặt

# cat << EOF >> /etc/yum.repos.d/varnish.repo
baseurl=https://repo.varnish-cache.org/redhat/varnish-4.0/el6/
gpgkey=https://repo.varnish-cache.org/GPG-key.txt
# yum update
# yum install -y varnish

- Cấu hình file /etc/sysconfig/varnish, thay đổi cổng mặt định sang cổng 80: 

VARNISH_LISTEN_PORT=80

- Cấu hình file /etc/varnish/default.vcl

vcl 4.0;
# set default Back-end if no server cluster specified
Back-end default {
    .host = "127.0.0.1";
    .port = "8080";
    # .port = "80" led to issues with competing for the port with apache.
}

# access control list for "purge": open to only localhost and other local nodes
acl purge {
    "127.0.0.1";
}

# access control list for cache-warming task: open to this server 
# (10.196.132.193 is the ip address of this server)
acl warmuper_ip {
    "10.196.132.17";
}

# vcl_recv is called whenever a request is received 
sub vcl_recv {
if (req.method == "POST") {
return(pipe);
}

    unset req.http.Cookie;

        # Serve objects up to 2 minutes past their expiry if the Back-end
        # is slow to respond.
        # set req.grace = 300s;
        set req.http.X-Forwarded-For = client.ip;
        set req.Back-end_hint= default;

        # Handle requests for warming up caches from localhost
        if (client.ip ~ warmuper_ip && req.http.Cache-Control ~ "no-cache") {
            set req.hash_always_miss = true;
        }
 
        # This uses the ACL action called "purge". Basically if a request to
        # PURGE the cache comes from anywhere other than localhost, ignore it.
        if (req.method == "PURGE") {
            if (!client.ip ~ purge) {
                return (synth(405, "Not allowed."));
            } else {
                return (purge);
            }
        }
 
        # Pass any requests that Varnish does not understand straight to the Back-end.
        if (req.method != "GET" && req.method != "HEAD" &&
            req.method != "PUT" && req.method != "POST" &&
    req.method != "TRACE" && req.method != "OPTIONS" &&
            req.method != "DELETE") {
                return (pipe);
        } /* Non-RFC2616 or CONNECT which is weird. */
 
        # Pass anything other than GET and HEAD directly.
        if (req.method != "GET" && req.method != "HEAD") {
            return (pass);
        }      /* We only deal with GET and HEAD by default */
 
        # Pass requests from logged-in users directly.
        # Only detect cookies with "session" and "Token" in file name, otherwise nothing get cached.
        # if (req.http.Authorization || req.http.Cookie ~ "session" || req.http.Cookie ~ "Token") {
        #    return (pass);
        #} /* Not cacheable by default */
 
        # Pass any requests with the "If-None-Match" header directly.
        if (req.http.If-None-Match) {
            return (pass);
        }
 
        # Force lookup if the request is a no-cache request from the client.
        if (req.http.Cache-Control ~ "no-cache") {
            ban(req.url);
        }
 
        # normalize Accept-Encoding to reduce vary
        if (req.http.Accept-Encoding) {
          if (req.http.User-Agent ~ "MSIE 6") {
            unset 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 {
            unset req.http.Accept-Encoding;
          }
        }
 
        return (hash);
}

sub vcl_pipe {
        # Note that only the first request to the Back-end will have
        # X-Forwarded-For set.  If you use X-Forwarded-For and want to
        # have it set for all requests, make sure to have:
        # set req.http.connection = "close";
 
        # This is otherwise not necessary if you do not do any request rewriting.
 
        set req.http.connection = "close";
}

# Called if the cache has a copy of the page.
sub vcl_hit {
        if (req.method == "PURGE") {
            ban(req.url);
            return (synth(200, "Purged"));
        }
 
        if (!obj.ttl > 0s) {
            return (pass);
        }
}
 
# Called if the cache does not have a copy of the page.
sub vcl_miss {
        if (req.method == "PURGE")  {
            return (synth(200, "Not in cache"));
        }
}

# Called after a document has been successfully retrieved from the Back-end.
sub vcl_Back-end_response {
unset beresp.http.set-cookie;

# Set expiry time for cache
set beresp.ttl = 900s;

# Set cache-control header for client browsers to cache the page
set beresp.http.cache-control = "max-age = 600";

        # set minimum timeouts to auto-discard stored objects
        set beresp.grace = 7200s;
       
 
        if (!beresp.ttl > 0s) {
          set beresp.uncacheable = true;
          return (deliver);
        }
 
        if (beresp.http.Set-Cookie) {
          set beresp.uncacheable = true;
          return (deliver);
        }

#       if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") {
#          set beresp.uncacheable = true;
#          return (deliver);
#        }
 
        if (beresp.http.Authorization && !beresp.http.Cache-Control ~ "public") {
          set beresp.uncacheable = true;
          return (deliver);
        }

        return (deliver);
}

- Cấu hình làm mới cache các trang dung lượng lớn

mkdir /varnish
cd /varnish/
vi warmup_urls.txt
/
/web/guest/chinh-quyen
/web/guest/cong-dan
/web/guest/doanh-nghiep
/web/guest/trang-chu
vi warmup_script.sh
wget --output-document=/dev/null --header='Cache-Control: no-cache' --tries=1 --quiet --base=http://danang.gov.vn --input-file=/varnish/warmup_urls.txt

- Cấu hình crontab thực hiện warmup_script.sh theo chu kỳ (phút)

Crontab –e
*/10 * * * * /varnish/warmup_script.sh

- Khởi động lại service Varnish để hoàn tất: 

# sudo service varnish restart
# sudo service varnish restart
# sudo service varnish restart

Phòng Tích hợp - Dữ liệu

Tin liên quan

Trang 1 / 63 - 626 dòngFirstPrevNextLast v
Trang 1 / 63 - 626 dòngFirstPrevNextLast v

Các đơn vị đối tác

TRUNG TÂM PHÁT TRIỂN HẠ TẦNG CÔNG NGHỆ THÔNG TIN ĐÀ NẴNG

Giấy phép: Số 151/GP-TTĐT do Sở Thông tin và Truyền thông cấp ngày 15/4/2015.

Trưởng Ban biên tập: Nguyễn Thị Huyền Thu, Phó giám đốc Trung tâm Phát triển hạ tầng Công nghệ thông tin Đà Nẵng.

Trụ sở: Tòa nhà 02 Quang Trung, Phường Thạch Thang, Quận Hải Châu, Tp Đà Nẵng.

Điện thoại: 84.236.3888.666 Fax 84.236.3888.879 Email: iid@danang.gov.vn.