Post Series: Varnish
  1. 1. Hướng dẫn cài đặt Varnish cho Nginx/Apache trên CentOS/Ubuntu
  2. 2. Varnish Agent – Công cụ quản lý và Theo dõi Varnish
  3. 3. Varnish Dashboard – Theo dõi Varnish trực quan, realtime
  4. 4. Cấu hình Varnish hoạt động với CloudFlare và Nginx
  5. 5. Cấu hình Varnish hoạt động trên 2 port khác nhau
  6. 6. Sử dụng HTTPS với Varnish

Trong bài viết này mình sẽ hướng dẫn bạn cách cài đặt và sử dụng Varnish làm front-end cho Nginx hoặc Apache để cache các request HTTP nhanh hơn mà không cần phải nhờ đến webserver xử lý.

Varnish Cache

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 hay MySQL xử lý.

Do sử dụng Memory để cache nên tốc độ truy xuất sẽ nhanh hơn rất nhiều so với Disk 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 đó PHP 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, Canh Me

Một số nhà cung cấp shared hosting cũng hỗ trợ sẵn Varnish như StableHost, SiteGround (chỉ những gói cao cấp). Nếu không muốn cài đặt vất vả, bạn có thể sử dụng luôn hosting ở đây.

Quá trình cài đặt và cấu hình Varnish Cache khá phức tạp, tuy nhiên điều này rất đáng để thử vì sau khi hoàn thành, website của bạn chắc chắn load vù vù cho coi.

I. Cài đặt Varnish

Bạn cần cài đặt trước LEMP hoặc LAMP server trước khi tiến hành cài đặt Varnish. Nếu chưa cài đặt, hãy tham khảo HocVPS Script, LEMP hoặc LAMP.

Với Ubuntu

aptitude update && aptitude install varnish

Với CentOS 6

yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
yum install varnish

Với CentOS 7

yum install epel-release
yum install varnish

Sau khi cài đặt thành công, tùy thuộc vào OS mà bạn đang sử dụng mà Varnish có phiên bản khác nhau:

  1. Ubuntu: 3.0.2-1
  2. CentOS: v4.0.3

Việc xác định phiên bản Varnish rất quan trọng, vì Varnish 3.0 có cách cấu hình, tham số khác hoàn toàn Varnish 4.0. Bạn có thể kiểm tra phiên bản sau khi cài đặt xong bằng lệnh varnishd -V

varnishd (varnish-4.0.3 revision b8c4a34)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2014 Varnish Software AS

Xem thêm hướng dẫn cài đặt trên CentOS/Redhat tại đây.

Một số hệ thống sử dụng OS x32 khi cài thì bị lỗi [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found", các bạn chuyển sang x64 nhé.

Kích hoạt Varnish tự động chạy

Với Ubuntu, CentOS 6.x

chkconfig --add varnish
chkconfig varnish on

Với CentOS 7.x

systemctl status varnish
systemctl enable varnish

II. Cấu hình Varnish

Có 2 file cấu hình bạn cần biết trước khi làm việc với Varnish:

1. File cấu hình tham số để Varnish hoạt động được

  • /etc/sysconfig/varnish trên CentOS 6.x hoặc
  • /etc/default/varnish trên Ubuntu hoặc
  • /etc/varnish/varnish.params trên CentOS 7.

2. File cấu hình VCL (Varnish Configuration Language) chứa các rule caching, /etc/varnish/default.vcl

Quy trình tiến hành cấu hình Varnish như sau:

  1. Thay đổi port để Varnish listen thành 80
  2. Thay đổi port để Web server listen thành 8080, hoặc port bất kỳ bạn muốn
  3. Varnish tự động kết nối đến web server khi có request

1. Cấu hình Varnish

Phiên bản Hệ điều hành Đường dẫn file Cấu hình tham khảo
Varnish 3 Ubuntu /etc/default/varnish
VARNISH_VCL_CONF=/etc/varnish/default.vcl
VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
VARNISH_MIN_THREADS=100
VARNISH_MAX_THREADS=5000
VARNISH_THREAD_TIMEOUT=120
VARNISH_STORAGE_SIZE=256M
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
VARNISH_SECRET_FILE=/etc/varnish/secret
VARNISH_TTL=120
Varnish 4 CentOS 6.x /etc/sysconfig/varnish
Varnish 4 CentOS 7 /etc/varnish/varnish.params
VARNISH_STORAGE="malloc,512M"

Bạn có thể thay đổi một số tham số mình thấy tối ưu nhất cho Varnish như sau:

  • thread_pool_min (VARNISH_MIN_THREADS) mặc định là 100, thay bằng 800/(số CPU Core). Ví dụ mình có 4 Core -> VARNISH_MIN_THREADS=200
  • thread_pool_max (VARNISH_MAX_THREADS) mặc định 5000, tuyệt đối không cấu hình quá 5000

VARNISH_STORAGE có 2 loại là mallocfilemalloc lưu cache trên Memory, có tốc độ xử lý cao hơn nhiều so với file lưu trên ổ cứng.

Xem thêm Varnish Tuning.

Cấu hình file VCL cho Varnish 4 để hoạt động được với WordPress

Do mình sử dụng WordPress và CentOS nhiều nên có chuẩn bị được file cấu hình VLC tối ưu này, các bạn có thể tham khảo sử dụng.

nano /etc/varnish/default.vcl

Thay thế toàn bộ bằng nội dung sau:

vcl 4.0;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 300s;
}

acl purge {
    "127.0.0.1";
}

sub vcl_recv {
        if (req.method == "PURGE") {
            if (!client.ip ~ purge) {
              return(synth(405,"Not allowed."));
            }

                if (req.http.X-Purge-Method == "regex") {
                        ban("req.url ~ " + req.url + " && req.http.host ~ " + req.http.host);
                        return (synth(200, "Banned."));
                } else {
                        return (purge);
                }
        }

        ### Do not Authorized requests.
        if (req.http.Authorization) {
                return(pass); // DO NOT CACHE
        }

        ### Pass any requests with the "If-None-Match" header directly.
        if (req.http.If-None-Match) {
                return(pass); // DO NOT CACHE
        }

        ### Do not cache AJAX requests.
        if (req.http.X-Requested-With == "XMLHttpRequest") {
                return(pass); // DO NOT CACHE
        }

        ### Only cache GET or HEAD requests. This makes sure the POST (and OPTIONS) requests are always passed.
        if (req.method != "GET" && req.method != "HEAD") {
                return (pass); // DO NOT CACHE
        }

        ### Static files: Do not cache PDF, XML, ... files (=static & huge and no use caching them - in all Vary: variations!)
        if (req.url ~ "\.(doc|mp3|pdf|tif|tiff|xml)(\?.*|)$") {
                return(pass); // DO NOT CACHE
        }

        # Unset the header for static files
        if (req.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
                unset req.http.cookie;
                set req.url = regsub(req.url, "\?.*$", "");
        }

        if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
                set req.url = regsub(req.url, "\?.*$", "");
        }

        if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
                return (pass);
        }

        if (req.http.cookie) {
                # Google Analytics
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__utm[a-z]+)=([^;]*)", "");
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(_ga)=([^;]*)", "");

                # Quant Capital
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__qc[a-z]+)=([^;]*)", "");

                # __gad __gads
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__gad[a-z]+)=([^;]*)", "");

                # Google Cookie consent (client javascript cookie)
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(displayCookieConsent)=([^;]*)", "");

                # Other known Cookies: remove them (if found).
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__CT_Data)=([^;]*)", "");
                set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(WRIgnore|WRUID)=([^;]*)", "");


                # PostAction: Remove (once and if found) a ";" prefix followed by 0..n whitespaces.
                # INFO \s* = 0..n whitespace characters
                set req.http.Cookie = regsub( req.http.Cookie, "^;\s*", "" );

                # PostAction: Unset the header if it is empty or 0..n whitespaces.
                if ( req.http.cookie ~ "^\s*$" ) {
                        unset req.http.Cookie;
                }
        }
}

sub vcl_backend_response {
        if ( (!(bereq.url ~ "(wp-(login|admin)|login)")) || (bereq.method == "GET") ) {
                //unset beresp.http.set-cookie;
                set beresp.ttl = 1h;
        }
        # Remove some headers we never want to see
        unset beresp.http.Server;
        unset beresp.http.X-Powered-By;

        if (bereq.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
                unset beresp.http.cookie;
                set beresp.ttl = 365d;
        }

        set beresp.ttl = 10s;
        set beresp.grace = 1h;
}

sub vcl_deliver {
    if (obj.hits > 0) {
      set resp.http.X-Cache = "HIT";
    } else {
      set resp.http.X-Cache = "MISS";
    }
    set resp.http.Access-Control-Allow-Origin = "*";
    set resp.http.Server = "HocVPS Script";
}

Bạn có thể test cấu hình VCL với lệnh bên dưới, nếu không xuất hiện lỗi gì là ok. Thoát varnishd bằng cách nhấn Ctrl+C

varnishd -F -f /etc/varnish/default.vcl

Khi update file cấu hình default.vcl, các bạn có thể reload Varnish vẫn giữ nguyên cache sử dụng init.d scripts:

/etc/init.d/varnish reload

hoặc thông qua Varnish Reload VCL script

varnish_reload_vcl

2. Cấu hình Web server

– Tiếp theo hãy chỉnh sửa file cấu hình của Web server để thay đổi port listen từ 80 thành 8080

Web Server Hệ điều hành File cấu hình Nội dung thay đổi
Apache Ubuntu /etc/apache2/ports.conf NameVirtualHost 127.0.0.1:8080
Listen 8080
/etc/apache2/sites-available/default
CentOS /etc/httpd/conf/httpd.conf Listen 8080
Nginx Ubuntu /etc/nginx/sites-enabled/default listen 127.0.0.1:8080 trong block server.
CentOS /etc/nginx/nginx.conf

Nếu dùng HocVPS Script thì bạn cấu hình lại toàn bộ tên miền ở folder /etc/nginx/conf.d/ chuyển listen 80; thành listen 127.0.0.1:8080;

– Điều chỉnh để hiển thị IP thật của visitor trong log file, thay vì 127.0.0.1.

Bạn hãy mở file cấu hình nginx:

nano /etc/nginx/nginx.conf

Thay đoạn log_format

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

bằng đoạn sau:

        set_real_ip_from        127.0.0.1;
        real_ip_header          X-Forwarded-For;
        log_format      main '$remote_addr - $remote_user [$time_local]  $status '
                '"$request" $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

Cuối cùng hãy restart Varnish và Web server.

Giờ bạn có thể truy cập vào IP để check xem hệ thống đã hoạt động chưa rồi đó.

Nếu sử dụng WordPress bạn hãy cài đặt thêm plugin Varnish HTTP Purge để tự động xóa cache khi publish hoặc update bài viết.

Để kiểm tra các service nào đang listen port, ví dụ 80, bạn có thể sử dụng lệnh: netstat -lntp | grep 80.

III. Testing Varnish

Để biết được Varnish có đang hoạt động hay không bạn sử dụng lệnh bên dưới:

curl -I domain.com

Lần đầu tiên chạy, để ý dòng X-Varnish bạn sẽ thấy một số, ví dụ:

X-Varnish: 1482416538

hoặc X-Cache: MISS

Sử dụng lệnh bên trên lần thứ 2, nếu thấy xuất hiện 2 số tức là Varnish đã hoạt động rồi đó, ví dụ:

X-Varnish: 1482416539 1482416538

hoặc X-Cache: HIT

Ngoài ra, bạn cũng có thể sử dụng 2 công cụ:

  1. varnishlog: xem Varnish logsreal time
  2. varnishstat: hiển thị tình trạng cache Varnish

Chúc bạn  thành công!

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

310 Comments

      1. Ngô Văn Cương 142 comment

        Đoạn này chỗ el và 6 thì giữ nguyên à bác:
        [varnishcache_varnish41]
        name=varnishcache_varnish41
        baseurl=https://packagecloud.io/varnishcache/varnish41/el/6/$basearch
        repo_gpgcheck=1
        gpgcheck=0
        enabled=1
        gpgkey=https://packagecloud.io/varnishcache/varnish41/gpgkey
        sslverify=1
        sslcacert=/etc/pki/tls/certs/ca-bundle.crt
        metadata_expire=300

        [varnishcache_varnish41-source]
        name=varnishcache_varnish41-source
        baseurl=https://packagecloud.io/varnishcache/varnish41/el/6/SRPMS
        repo_gpgcheck=1
        gpgcheck=0
        enabled=1
        gpgkey=https://packagecloud.io/varnishcache/varnish41/gpgkey
        sslverify=1
        sslcacert=/etc/pki/tls/certs/ca-bundle.crt
        metadata_expire=300

  1. Nguyễn Minh Hùng 4 comment

    mình tới bước 2. Cấu hình thì bị lỗi này.
    /etc/varnish/varnish.params: Permission denied
    Nhờ admin chỉ giúp với ạ

    1. Việt Phương Moderator

      Bạn có dùng user có quyền root không? Vì bạn đang không chỉnh sửa đc file ý

      1. Nguyễn Minh Hùng 4 comment

        Hiện tại mình dùng ZOC Terminal kết nối SSH không được. Việc gần nhất mà mình làm là cài SSL Web vẫn vào được bình thường. Không biết có phải vì thế mà không chỉnh sửa được file ko nhỉ

        1. Việt Phương Moderator

          Không liên quan đến nhau nhé bạn. Bạn kiểm tra đăng nhập qua console của nhà cung cấp có được không? Có thể bạn đăng nhập sai bị block 1h

  2. tran hung 50 comment

    cho mình hỏi phần test varnish có hoạt động hay không
    mình dùng lệnh curl -I domain.com hay curl -I https://domain.com
    vì web mình dùng https
    nếu test không có https thì thấy X-Varnish
    nhưng nếu có https thì không thấy

    curl -I domain.net
    HTTP/1.1 301 Moved Permanently
    Date: Wed, 16 May 2018 17:48:55 GMT
    Server: Varnish
    X-Varnish: 4
    Location: https://domain.net/
    Content-Length: 0
    Connection: keep-alive

    curl -I https://domain.net
    HTTP/1.1 200 OK
    Server: nginx
    Date: Wed, 16 May 2018 17:48:49 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Vary: Accept-Encoding
    Set-Cookie: PHPSESSID=qdltbln40c0pk384ha6oj899i4; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate
    Pragma: no-cache
    Strict-Transport-Security: max-age=31536000
    Strict-Transport-Security: max-age=31536000; includeSubDomains

    Nhờ admin hướng dẫn giúp ạ

  3. Trường 13 comment

    cho mình hỏi mình dùng web mã nguồn khác không phải WordPress như opencart hay site php khác thì cấu hình như thế này liệu có hoạt động được không bạn?

  4. Huynh Ngoc Duy 10 comment

    Mình cài trên CentOS 6 x64 nhưng varnishd không đúng phiên bản nào cả là sao vậy bạn???

    varnishd (varnish-2.1.5 SVN )
    Copyright (c) 2006-2009 Linpro AS / Verdens Gang AS

    1. Việt Phương Moderator

      Bước rpm bạn không thành công thì phải. Bạn remove varnish rồi cài đặt lại
      Và CentOs bạn phiên bản gì: cat /etc/*-release

  5. Cu tí 1 comment

    Chào Ad!

    Mình đã cài Varnish theo hướng dẫn của bạn và “có vẻ” như đã thành công. Sở dĩ mình nói có lẽ là bởi mình thử CURL đến website nhưng không thấy xuất hiện 2 số mà lần nào cũng chỉ 1 số thôi. Không biết như vậy là varnish đã hoạt động đúng chưa. Rất mong được bạn giải đáp thắc mắc. Mình cảm ơn nhiều!

  6. sinhle 54 comment

    Chào ad,
    Mình bị lỗ ntn bạn giúp. cảm ơn

    # varnishd -F -f /etc/varnish/default.vcl
    Message from VCC-compiler:
    Expected one of
    ‘acl’, ‘sub’, ‘backend’, or ‘director’
    Found: ‘vcl’ at
    (input Line 1 Pos 1)
    vcl 4.0;
    ###—–
    Running VCC-compiler failed, exit 1
    VCL compilation failed

      1. sinhle 54 comment

        Mình copy theo code củ ad trong bài “Thay thế toàn bộ bằng nội dung sau:” . xọng chạy lênh “varnishd -F -f /etc/varnish/default.vcl” thì báo lỗi ạ.
        Nhân tiện. Mình cài trên Os 6. Nhưng cài xong check “varnishd -V” thì chỉ có Varnish “varnishd (varnish-2.1.5 SVN )”. Chứ không phải Varnish 4.0.

      2. sinhle 54 comment

        À mình lại gặp lỗi này. Đây là VPS cũ có cài được Varnish 4.0

        [root@vultr home]# varnishd -F -f /etc/varnish/default.vcl
        bind(): Address already in use
        bind(): Address already in use
        Error: Failed to open (any) accept sockets.”
        Nhờ ad hỡ trợ.

        1. Việt Phương Moderator

          1. Như Varnish báo, không phải Varnish 4.0 nên sử dụng cấu hình 4.0 sẽ sai. Và bản CentOs6 bạn có thể chưa update repo nên bạn không cài đặt được. Bạn reinstall lại nếu không được thì bạn cài trên CentOS 7 đi
          2. Vì Nginx bạn chưa cấu hình lại nên Varnish và Nginx hiện vẫn dùng chung 1 port 80 Address already in use

          1. sinhle 54 comment

            Mình truy cập vào
            “nano /etc/nginx/nginx.conf” thì không có block server như trong hướng dẫn “2. Cấu hình Web server”
            Đây là file của mình ” https://pastebin.com/ERa15cf4

            còn domain mình cấu hình như sau

            server {
            listen 127.0.0.1:8080;

            server_name 1doi1.com;
            rewrite ^(.*) http://www.1doi1.com$1 permanent;
            }

            server {
            listen 127.0.0.1:8080; default_server;

            .
            Nhờ ad check giúp. cảm ơn.

          2. Việt Phương Moderator

            1. Trong bài viết có lưu ý dành cho riêng cho HocVPS. Bạn cũng đã sửa theo lưu ý rồi mà, có cần động vào nginx.conf đâu
            2. netstat -nlpt của bạn ra kết quả gì. Và nếu bạn cài Varnish bạn bắt buộc phải cài cho toàn bộ các site trong VPS

          3. Việt Phương Moderator

            tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 18681/nginx
            tcp 0 0 :::80 :::* LISTEN 18767/varnishd

            Varnish và Nginx vẫn dùng port 80 nhé. Bạn phải sửa toàn bộ cấu hình của các domain trong VPS chứ không phải chỉ 1 domain. Hiện tại Nginx vẫn dùng 80 là không được rồi

          4. sinhle 54 comment

            À. hèn chi. Vì mình chỉ cấu hình cho 1 domain. Cái này bất tiện nhỉ. vì nếu có chục domain vẫn phải làm cho chục cái.
            Với mấy cái subdomain cũng cấu hình luôn phải không ad?
            Cảm ơn

          5. sinhle 54 comment

            Sau khi mình cấu hình cho toàn bộ các domain và chạy code

            1————————
            “varnishd -F -f /etc/varnish/default.vcl” thì nhận lỗi.
            bind(): Address already in use
            bind(): Address already in use
            Error: Failed to open (any) accept sockets.

            2————————–
            Và chạy lệnh test” curl -I 1doi1.com”
            thì không thấy xuất hiện varnish

            HTTP/1.1 301 Moved Permanently
            Date: Sat, 11 Nov 2017 03:05:39 GMT
            Connection: keep-alive
            Cache-Control: max-age=3600
            Expires: Sat, 11 Nov 2017 04:05:39 GMT
            Location: https://1doi1.com/
            Server: cloudflare-nginx
            CF-RAY: 3bbe07f643793373-HKG

            Nhờ ad hỗ trợ mình!

          6. Việt Phương Moderator

            bind(): Address already in use Bao giờ bạn chạy netstat mà nginx không còn 80 thì mới được nhé. Theo đúng mô hình Varnish 80 Nginx 8080 nên bạn phải config toàn bộ thôi

  7. Thunder Clap 5 comment

    Hi ad, mình đã đổi port như theo hướng dẫn và chạy OK, nhưng kiểm tra header của https://domain.com trả về thì không thấy dòng X-Varnish hay X-Cache đâu cả 🙁

    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 23646/nginx
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22008/varnishd
    tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 23646/nginx

    1. Việt Phương Moderator

      Bạn dùng SSL thì phải cấu hình tiếp. Hiện tại Varnish mới hoạt động ở 80 thôi, còn HTTPS hoạt động trên 443 cơ. Bạn đọc bài tiếp theo trong series đi

      1. Thunder Clap 5 comment

        Hi, đọc qua series thì mình hiểu sử dụng proxy nginx (443) -> varnish (80) -> backend server (8080)

        Để cấu hình thêm https, ngoài cấu hình như bài trên, phía ssl nginx mình có thêm mấy dòng proxy (*)
        server {
        listen 443 ssl http2;
        server_name domain.com
        # SSL
        ssl_certificate /etc/letsencrypt/live/ domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ domain.com/privkey.pem;

        (*)
        location / {
        proxy_pass http://127.0.0.1;
        proxy_set_header Host $http_host;
        #proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        }
        }

        Còn về phía varnish, mình có thêm

        sub vcl_recv {
        # Ask Varnish to fire 750 status for HTTP requests from external IPs and port 80,
        # and not from SSL Termination Proxy (Nginx).
        if ( (req.http.host ~ “^(?i)www.domain.com” || req.http.host ~ “^(?i)domain.com”) && req.http.X-Forwarded-Proto !~ “(?i)https”) {
        return (synth(750, “”));
        }
        }

        sub vcl_synth {
        # Listen to 750 status from vcl_recv.
        if (resp.status == 750) {
        set resp.status = 301;
        set resp.http.Location = “https://domain.com” + req.url;
        return(deliver);
        }

        Mà vẫn không được (header trả về với https không có x-varnish), vào phía admin của worpdress (wp-admin) thì bị loop redirect, không biết mấy dòng config varnish có bị lỗi gì không ?

        Mò trên mạng cả 2 ngày nay cũng nhiều trường hợp tương tự như em, mà không biết giải quyết sao , ahuhu 🙁

          1. Thunder Clap 5 comment

            Hi, em remove lại varnish và cài lại như hướng dẫn thì OK rồi ạ, mà có vấn đề là khi em curl -I https://domain.com thì trạng thái header X-Cache đã từ MISS -> HIT.
            Nhưng khi truy cập bằng browser thì MISS mãi thôi :(.
            Em có cài plugin WP Rocket phía backend, mà không biết có xung đột gì không ?

  8. phuha 13 comment

    Mình cài xong giờ vào web bị lỗi Too Many Redirects, fix sao bây giờ bạn?

    1. Việt Phương Moderator

      Lỗi này chủ yếu xoay quanh webserver nên bạn kiểm tra lại Nginx conf, Varnish conf và log 2 services này

  9. phuha 13 comment

    bi lỗi này là sao vậy ad

    curl: (7) Failed connect to nuocmamphuha.com:80; Connection refused

    mình xài let’s encrypt đã cấu hình theo như hướng dẫn

    1. Việt Phương Moderator

      Bạn chưa cấu hình lại Nginx nên Varnish không lấy được port 80. Và bên cạnh đó, bạn đã cài SSL thì cũng phải để Varnish lấy cả port 443

      1. phuha 13 comment

        Hướng dẫn chi tiết hơn được không bạn, mình không rành config mấy cái này

      2. phuha 13 comment

        File nginx.config của mình không có block server bạn ơi, config sao cho đúng vậy

        1. Việt Phương Moderator

          Nó không phải file ý, file bạn cấu hình SSL khi cài đặt ý. Bạn đọc cả series Varnish thì rõ nhé

  10. Dang Long 16 comment

    hình như trang chủ varnish mới update nên cách cài đặt này ko còn dùng được nữa, admin update cách cài đặt mới giúp với 🙁

    1. Việt Phương Moderator

      Vẫn cài đặt bình thường mà. Mình không thấy thông tin gì về vấn đề này, bạn có thì chia sẻ nhé

    1. Việt Phương Moderator

      Bạn có thể tham khảo thêm các cấu hình VCL khác trên mạng nhé

  11. Thủy 2 comment

    Vanish dùng chung với Memcached được không ạ? Mình thấy cách hoạt động cả 2 khá giống nhau, đều lưu cache trên RAM.

    Hiện mình đang dùng Memcached (kết hợp với W3 Total) rồi, giờ cài thêm Vanish thì có bị xung đột không? Tốc độ có cải thiện nhiều không?

    1. Việt Phương Moderator

      Không nên bạn à. Bạn dùng Memcached + W3 Total là ổn rồi, k cần cài thêm Varnish

  12. quốc anh 38 comment

    Giờ em muốn xóa Varnish thì thế nào vậy ad ơi :'( Ad giúp với. Tks ad!

    1. Việt Phương Moderator

      yum remove varnish thôi. Các cấu hình Nginx/Apache đã sửa thì sửa lại như cũ

  13. kính 16 comment

    chào admin, web mình tầm 3500 truy cập 1 ngày thì sài cache này có phù hợp ko ạ, hay phải sài cache khác ạ. mình cảm ơn

    1. Việt Hùng 14 comment

      Chán quá cài mãi không được. Mình lại bị như này.
      [root@chiasewp home]# systemctl status varnish
      ● varnish.service – Varnish Cache, a high-performance HTTP accelerator
      Loaded: loaded (/usr/lib/systemd/system/varnish.service; enabled; vendor preset: disabled)
      Active: failed (Result: exit-code) since Thu 2017-07-27 21:51:51 +07; 1min 34s ago
      Process: 7158 ExecStart=/usr/sbin/varnishd -P /var/run/varnish.pid -f $VARNISH_VCL_CONF -a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} -S $VARNISH_SECRET_FILE -s $VARNISH_STORAGE $DAEMON_OPTS (code=exited, status=2)
      Main PID: 7048 (code=exited, status=2)

      Jul 27 21:51:51 chiasewp varnishd[7158]: (‘input’ Line 27 Pos 8)
      Jul 27 21:51:51 chiasewp varnishd[7158]: if(req.request == “PURGE”){
      Jul 27 21:51:51 chiasewp varnishd[7158]: ——-###########————-
      Jul 27 21:51:51 chiasewp varnishd[7158]: Running VCC-compiler failed, exited with 2
      Jul 27 21:51:51 chiasewp varnishd[7158]: VCL compilation failed
      Jul 27 21:51:51 chiasewp systemd[1]: varnish.service: control process exited, code=exited status=2
      Jul 27 21:51:51 chiasewp systemd[1]: Failed to start Varnish Cache, a high-performance HTTP a…tor.
      Jul 27 21:51:51 chiasewp systemd[1]: Unit varnish.service entered failed state.
      Jul 27 21:51:51 chiasewp systemd[1]: varnish.service failed.
      Jul 27 21:52:00 chiasewp systemd[1]: Unit varnish.service cannot be reloaded because it is inactive.
      Hint: Some lines were ellipsized, use -l to show in full.
      [root@chiasewp home]# system enable varnish
      -bash: system: command not found

      1. Việt Phương Moderator

        1. Như nó ghi đó Hint: Some lines were ellipsized, use -l to show in full. Bạn chạy thêm hậu tố -l để show full kết quả. Chắc sai ở file vcl conf.
        2. systemctl nhé bạn. Mình sửa trong bài viết rồi

  14. Manh Doan 21 comment

    Mình cài xong như bài xong chạy lệnh thì ra kết quả như thế này:
    [root@vultr home]# varnishd -F -f /etc/varnish/default.vcl
    bind(): Address already in use
    bind(): Address already in use
    Error: Failed to open (any) accept sockets.

    không biết lỗi này là như thế nào nhỉ, và sửa như thế nào?
    Cám ơn bạn

    1. Việt Phương Moderator

      Bạn sửa cấu hình của toàn bộ các site Virtual host (Nginx/Apache) chưa. Bạn đang có 2 service cùng 1 port. Bạn chú ý phần:
      - Thay đổi port để Varnish listen thành 80
      - Thay đổi port để Web server listen thành 8080, hoặc port bất kỳ bạn muốn

      1. Manh Doan 21 comment

        Chào bạn,
        Mình dùng hocvps cài cho vps của mình, ko nhớ đặt tên file kiểu gì giờ tên file ở trong thư mục conf.d nó ra tên như thế này
        �www.domain.conf có cái ký tự gì đằng trước ấy (hình như à æ – mình thử r nhưng không được).
        Nên giờ ko thể vào cấu hình đổi port web server listen được :((.
        Không biết giờ làm thế nào bạn nhỉ?

        1. Việt Phương Moderator

          Do lúc gõ bạn dùng unikey thì ký tự w bị thế thôi. Bạn xóa thủ công website đó và conf nginx của website đó đi rồi add lại. Còn nếu không thì bạn sửa thủ công tên Nginx Conf, nội dung trong Nginx Conf, thư mục web thành đúng ký tự chuẩn

          1. Manh Doan 21 comment

            Bạn ơi có link nào hướng dẫn sửa thủ công tên file không ạ gửi mình ới? Mình mới nên ko biết gì cả, toàn làm theo trên hocvps hướng dẫn thôi 😀

          2. Việt Phương Moderator

            Không có cụ thể đâu bạn à. Bạn có thể dùng ls -al để liệt kê rồi copy y nguyên cái tên, rồi dùng mv để move
            https://hocvps.com/21-cau-lenh-linux-phai-nho/ . Hoặc bạn có thể dùng Bitvise đăng nhập sFTP rồi đổi tên file trên giao diện Browse Thư Mục
            Mình thấy bạn xóa site đi import lại thì đơn giản hơn, dùng hocvps menu 1 để liệt kê rồi copy y nguyên sang hocvps menu 3 để xóa

            Lưu ý: Nếu site đó là site chính cài HocVPS thì bạn không thể đổi, do liên quan đến cấu hình log các service

  15. Lộc 52 comment

    mình cài đặt hocvps nhưng cài varnish theo cấu hình này thì k thể login đc wp-admin. nó trả về trang index.php báo lỗi k thể kết nối

    1. Lộc 52 comment

      mình dùng Let’s Encrypt và cấu hình theo bài cuối trong serie thì phát hiện cái dòng này bị lỗi hoặc có thể k “proxy_pass http://127.0.0.1:80;”.
      Nếu thíu dòng này thì k cache đc => login admin đc,
      Còn thêm dòng này thì bị lỗi

      1. Việt Phương Moderator

        Oh dòng nào bạn? Ngoài ra bạn có thay đổi đường dẫn mặc định của wp-admin sang loại khác không?
        Vì có dòng này dành riêng cho wp-login/admin rồi mà
        if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
        return (pass);

        1. Lộc 52 comment

          mình dữ mặc định hết. và thêm đonạ bên dưới vào file domain.ltd.conf

          proxy_pass http://127.0.0.1:80;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto https;
          proxy_set_header X-Forwarded-Port 443;
          proxy_set_header Host $host;”

          vào cặp location ~ \.php$ { }

  16. Thanh Sơn 4 comment

    Mình start varnish thì gặp lỗi này, fix thế nào vậy ạ
    bind(): Address already in use
    bind(): Address already in use
    Error: Failed to open (any) accept sockets

    1. Việt Phương Moderator

      Bạn cấu hình Webserver chưa? Thông báo kia là 2 service đang cùng nghe 1 port. Kiểu Nginx và Varnish cùng port 80

  17. Zan Nguyễn 56 comment

    Hi ad,

    Mình kiểm tra thì thấy nginx vẫn đang sử dụng port 80. Làm cách nào để thay đổi vậy ad ?

    Xin cảm ơn.

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21314/nginx: master
    tcp 0 0 45.114.117.168:80 27.64.94.161:2327 ESTABLISHED 21316/nginx: worker
    tcp 0 0 45.114.117.168:80 27.64.94.161:52195 TIME_WAIT –
    tcp6 0 0 :::80 :::* LISTEN 15224/varnishd
    udp6 0 0 fe80::216:3eff:fe4f:123 :::* 432/ntpd

  18. Hải Đăng 1 comment

    anh cho em hỏi là e cài đặt Varnish nhưng khi gõ lệnh restart Varnish thì bị báo lỗi, khi em gõ systemctl status varnish.service thì được lỗi như hình ở dưới, em nên sửa hay cấu hình kiểu gì ạ ?
    http://imgur.com/a/cq2QA

    1. Việt Phương Moderator

      Kết quả của varnishd -F -f /etc/varnish/default.vclsystemctl start varnish là gì bạn

    1. Việt Phương Moderator

      Cài đặt thì giống nhau. Tuy vậy cấu hình tham khảo chỉ là tối ưu với WP và trên CentOS bạn à

  19. technew 6 comment

    Connection failed (127.0.0.1:6082): (null)
    Unable to run varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 vcl.list

    mình đang cài varnish với https gap phai error nay , ban coi giup minh

  20. nam 1 comment

    Anh Luân ơi, em chạy câu này: systemctl status varnish
    Nó ra lỗi này, làm sao để sửa vậy anh
    varnish.service – Varnish Cache, a high-performance HTTP accelerator
    Loaded: loaded (/usr/lib/systemd/system/varnish.service; disabled; vendor preset: disabled)
    Active: inactive (dead)

  21. MrDuc 14 comment

    Khi mình chạy lệnh varnishd -F -f /etc/varnish/default.vcl có thông báo lỗi bind(): Address already in use và Error: Failed to open (any) accept sockets. Lỗi này là sao nhỉ? Có bạn nào biết nguyên nhân không? Mình dùng Nginx + php-fpm + suhosin. Liệu có phải cái suhosin nó chặn cổng gì không? Cảm ơn nhiều

    1. Việt Phương Moderator

      netstat -nlpt bạn xem có gì đang dùng trùng port không? Hoặc bạn kill tất cả các process varnish killall varnishd đi để khởi động lại

      1. MrDuc 14 comment

        Ok Thanks bạn, mình mất cả một ngày để làm cái varnish này, cấu hình được cho 3 cms khác nhau. Giờ thì có vẻ mọi thứ đã ok. Website cung cấp nhiều thông tin hữu ích quá.

        1. Việt Phương Moderator

          Không ảnh hưởng thì bạn có thể post và note cho mọi người cùng tham khảo 🙂 Thanks and nice day ahead

          1. MrDuc 14 comment

            Thực sự có những chỗ mình cũng chưa hiểu lắm, chỉ là cóp nhặt trên mạng, Post lên để có bạn nào giống mình thì tham khảo. VPS của mình có 3 loại cms: Prestashop, Drupal, WordPress Riêng Prestashop do mình sử dụng theme mobile riêng không phải responsive nên mình có một file để kiểm tra có phải người dùng truy cập từ mobile hay không. Lúc đầu nó bị lỗi khi truy cập từ Desktop thì trên mobile nó cũng cache và trả về giao diện giống desktop tất nhiên là giao diện này không xem được trên mobile rồi (hoặc ngược lại). Có mấy chỗ đường dẫn do mình đã đổi đường dẫn trên prestashop nên mình check theo đường dẫn đó các bạn cũng chú ý. Mình có 2 file như sau:
            mobile_detect.vcl: https://pastebin.com/F5dGRmQH
            default.vcl: https://pastebin.com/qbzYSuPu

  22. hoang viet 7 comment

    Hi Luân,

    Mình dùng lệnh “curl -I mydomain.com” để kiểm tra thì không thấy có thông số X-Varnish: hay X-Cache http://imgur.com/AxSAgkj
    Làm sao để biết varnish đã hoạt động với website hay chưa

      1. hoang viet 7 comment

        Mình chạy được với website đầu tiên, nhưng sau khi add thêm website (bằng hocvps) thì bị lỗi 504 gateway nginx ở cả 2 website. Chạy “varnishd -F -f /etc/varnish/default.vcl” thì ra lỗi này:

        bind(): Address already in use
        bind(): Address already in use
        Error: Failed to open (any) accept sockets.

        1. Việt Phương Moderator

          Có vẻ vấn đề nằm ở socket khi thiết lập cho website thứ 2 không cùng port với website thứ nhất được (tức không cùng 8080)
          Nếu không Varnish sẽ chỉ hoạt động trên 1 site

          1. Việt Phương Moderator

            HIT bình thường mà bạn? Bạn restart lại các service xem. Do bạn tạo website mới thì Nginx conf của website mới tạo là Nginx port 80. Chiếm mất port của Varnish

  23. vntech 6 comment

    Varnish hiện có phiên bản varnish-4.1.el7.rpm , install 4.1 có khác với 4.0 không vậy a

  24. Hùng 6 comment

    kiểm tra version hiện error bạn giúp mình mới

    varnishd -V

    varnishd: error while loading shared libraries: libvarnish.so: cannot open shared object file: No such file or directory

  25. A tèo 7 comment

    làm sao để cấu hình varnish chạy 2 site luân ơi.

    mình cấu hình 2 site chạy chung 1 vps dùng hocvps script
    mà măc định domain thứ 2 cứ tro mặc định về domain 1 không à
    [root@li872-104 home]# curl -I kienthuckhoedep.com
    HTTP/1.1 200 OK
    Server: nginx
    Date: Tue, 28 Feb 2017 06:12:16 GMT
    Content-Type: text/html; charset=UTF-8
    X-Powered-By: PHP/5.6.30
    Link: ; rel=”https://api.w.org/”
    Last-Modified: Tue, 28 Feb 2017 05:13:09 GMT
    Vary: Accept-Encoding
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Varnish: 32784
    Age: 0
    Via: 1.1 varnish-v4
    Connection: keep-alive
    ————————
    [root@li872-104 home]# curl -I avabuy.com
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Tue, 28 Feb 2017 06:11:35 GMT
    Content-Type: text/html; charset=UTF-8
    X-Powered-By: PHP/5.6.30
    Location: http://kienthuckhoedep.com/
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Varnish: 65553
    Age: 0
    Via: 1.1 varnish-v4
    Content-Length: 0
    Connection: keep-alive

    ———–

  26. VIET PHAM 1 comment

    Luân ơi, cho thắc mắc cái. Mình làm chạy hết rồi. Chỉ có điều là Woocommerce thì không chạy. Luân có đoạn config default.vcl cho Woocommerce không? Hoặc hướng dẫn cho mình với

  27. Le Dinh Nhon 1 comment

    Cho mình hỏi, mình đã đổi port 6081 -> 80 trong /etc/default/varnish rồi mà tại sao khi gõ lệnh service varnish restart – > netstat -ntlup thì varnish vẫn còn là 6081.

    Giúp mình với nhé !

      1. Phong 3 comment

        X-Cache:Miss vẫn thế bạn à.

        – phải cấu hình ntn để chạy song song cả memcached được?

        Thanks

          1. Việt Phương Moderator

            Chưa bàn đến memcached, phần bạn test Varnish vẫn chưa OK mà

  28. Tran Hung 50 comment

    cho hỏi mình thâý bạn hướng dẫn chỗ này
    thread_pools mặc định 2, thay bằng số CPU Core
    nó nằm ở đâu vậy? trong file varnish.params mình chỉ để các thông tin này
    VARNISH_VCL_CONF=/etc/varnish/default.vcl
    VARNISH_LISTEN_ADDRESS=
    VARNISH_LISTEN_PORT=80
    VARNISH_MIN_THREADS=100
    VARNISH_MAX_THREADS=5000
    VARNISH_THREAD_TIMEOUT=120
    VARNISH_STORAGE=”malloc,1024M”
    VARNISH_SECRET_FILE=/etc/varnish/secret
    VARNISH_TTL=120
    VARNISH_USER=varnish
    VARNISH_GROUP=varnish

    1. Luân Trần Admin

      Cái đó của phiên bản Varnish khác, nếu không có thì bạn bỏ đi nhé.

  29. Nguyên Hào 22 comment

    Luân cho mình hỏi thêm , là khi cài đặt Vanish xong cho web của mình , nó lại trỏ về web mặc định khi cài Hocvps , khắc phục lỗi này thế nào Luân nhỉ . Thanks

  30. Nguyên Hào 22 comment

    system enable varnish

    lệnh này trên CentOS7 , ko chạy được Luân đại ka ơi

      1. Zan Nguyễn 56 comment

        Admin ơi cập nhật dòng lệnh này vào phần hướng dẫn nhé. Lệnh hiện tại trong bài hướng dẫn ko sử dụng được.

        Tks ad

  31. Trong Tri 10 comment

    Luân ơi, cài xong mình check thấy bị MISS rồi đã thử nhiều lần, mình sử dụng Directadmin.

    curl -I thietkewp.com
    HTTP/1.1 200 OK
    Date: Tue, 11 Oct 2016 04:11:51 GMT
    Content-Type: text/html; charset=UTF-8
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Link: ; rel=”https://api.w.org/”
    Set-Cookie: PHPSESSID=er3d7cg0ecsikt4v9qufdhuh90; path=/
    Vary: Accept-Encoding,User-Agent
    X-Varnish: 32831
    Age: 0
    Via: 1.1 varnish-v4
    X-Cache: MISS
    Access-Control-Allow-Origin: *
    Server: HocVPS Script
    Connection: keep-alive

        1. Việt Phương Moderator

          Bạn kiểm tra lại varnish service và cấu hình chứ hiện tại thông báo vậy là Varnish không hoạt động

          1. Nguyen Kien 34 comment

            Bạn có suggest là kiểm tra ở đâu ko?
            Mình cài hocvps, centos7.

  32. haint 4 comment

    Hi Luân . mình đang bị lỗi này. Port Nginx cấu hình chưa đúng

    [root@vps conf.d]# vi /etc/nginx/nginx.conf
    [root@vps conf.d]# service nginx restart
    Stopping nginx: [FAILED]
    Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] still could not bind()

    1. Luân Trần Admin

      Do cấu hình ở đâu vẫn dùng port 80 rồi, bạn check lại toàn bộ các file .conf nha

  33. long 2 comment

    cho mình hỏi cái vanish này bao lâu thì nó tự xóa cache, hay là mình phải xóa = tay vậy

    1. Dinh Le Giang 51 comment

      Nếu bạn cài trên Centos và Varnish 4 thì làm theo cách này
      Bạn chạy lệnh sudo nano /etc/varnish/default.vcl
      Ở dòng sub vcl_backend_response {
      Bạn thêm 2 code sau vào (cái này là 1 tiếng đó)
      set beresp.ttl = 600s;
      set beresp.grace = 600s;
      Sau đó lưu lại bằng cách nhấn phím Ctrl + O và thoát bằng Ctrl + X rồi chạy lệnh service varnish restart để khởi động lại dịch vụ

    2. Luân Trần Admin

      Khi nào nội dung website thay đổi thì nó tự động cập nhật cache. Với những file tĩnh như .css, .js thì thời gian có thể lâu hơn.
      Ngoài cách của Dinh Le Giang, có thể xóa chủ động bằng cách vào Varnish Dashboard (Varnish Agent cũng được), Manage Server rồi Clear Panic

  34. hanh 1 comment

    Bạn Luân ơi !

    cho mình hỏi, mình có 5 trang web trên 1 VPS, giờ muốn 4 trang sử dụng Varnish, còn 1 trang thì không sử dụng thì có làm được ? nếu được thì cấu hình thế nào ?