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. tran hung 50 comment

    Vậy có cần phải xoá Memcached khi đã cái varnish hay vẫn có thể chạy song song. Bạn có thể giải thích cho mình với. Cảm ơn

    1. Luân Trần Admin

      Chạy song song ok nhé bạn, Varnish cache fullpage, Memcache cache Object, database

  2. Z Mụp Nguyễn 4 comment

    MÌnh cài ở bước đầu tiên nó bị lỗi này nè ad ui 🙁

    https://repo.varnish-cache.org/redhat/varnish-4.0/el6/i386/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 404 Not Found”
    Trying other mirror.
    To address this issue please refer to the below knowledge base article

    https://access.redhat.com/articles/1320623

    If above article doesn’t help to resolve this issue please open a ticket with Red Hat Support.

    Error: Cannot retrieve repository metadata (repomd.xml) for repository: varnish-4.0. Please verify its path and try again

      1. Z Mụp Nguyễn 4 comment

        Mình sử dụng VPS của Dedi :

        2CPU / 2GB RAM
        CentOS release 6.8 (Final)
        2.6.32-642.1.1.el6.i686 #1 SMP Tue May 31 20:41:01 UTC 2016 i686 i686 i386 GNU
        Hocvps Scripts

        1. Luân Trần Admin

          Gửi mình thông tin root được không, mình mới test lại với Vultr cài đặt bình thường luôn.

  3. Z Mụp Nguyễn 4 comment

    Hi pác Luân,

    VPS mình chạy hocvps, đã cài memcache, giờ muốn cài Varnish thì có cần reset vps cài os lại. Sau đó cài lại hết từ đâu không ?

    Nếu không thì làm cách nào để gỡ Memcache ra pác nhỉ ?

    Cảm ơn pác ^^

    1. Minh 21 comment

      Mình tìm ra rồi nhưng trong file nhiều value quá ad ơi. Có thể cho mình xin nội dung file của ad dc ko ?? /etc/sysconfig/varnish

      thanks

      1. Luân Trần Admin

        Bạn cần edit cái gì. Trong file có vài value thôi mà, đâu có nhiều lắm 😀

  4. Minh Thanh 56 comment

    root@SVR002:~# netstat -lntp | grep 80
    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 21406/apache2
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21123/varnishd
    tcp6 0 0 :::80 :::* LISTEN 21123/varnishd
    ————————-
    root@SVR002:~# varnishd -F -f /etc/varnish/default.vcl
    Error: Cannot open socket: :80: Address already in use
    root@SVR002:~# varnishd -F -f /etc/varnish/default.vcl
    Error: Cannot open socket: :80: Address already in use
    ————
    root@SVR002:~# curl -I domain.com
    HTTP/1.1 200 OK
    Date: Thu, 18 Aug 2016 17:35:22 GMT
    X-Content-Type-Options: nosniff
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    Vary: Accept-Encoding
    Content-Type: text/html; charset=UTF-8
    Pragma: no-cache
    Expires: -1
    Cache-Control: no-store, no-cache, must-revalidate, max-age=0
    Accept-Ranges: bytes
    Connection: keep-alive

    —————————————–
    Nhu vay thi Varnish co chay chua a Luan ?

    1. Luân Trần Admin

      Vậy chưa được rồi, output lệnh curl phải có thông tin Varnish mới được.

      1. Dinh Le Giang 51 comment

        Cảm ơn bác, đang ngâm cứu, em xài Sentora cấu hình port truy cập panel lại nên sẽ hơi khác nginx của bác. Nhưng với gợi ý này chắc sẽ làm được

    1. Luân Trần Admin

      Tất nhiên rồi. Nếu muốn dùng IP trung gian nữa thì bạn phải cấu hình cho Varnish listen trên port đó và forward về IP gốc.

  5. ĐInh Lê Giang 25 comment

    Bác ơi. Em muốn làm 1 VPS trung gian chạy varnish cache như canhme.com vậy.
    Cái phần web thì OK rồi, nhưng em xài sentora và đã cấu hình panel truy cập bằng port dạng IP:port.
    Giờ muốn cấu hình qua varnish cache nữa thì làm thế nào, vì domain mình trỏ qua IP của VPS trung gian

  6. Bảo 17 comment

    Hi Luân,
    Vừa cài memcached vừa cài varnish có được không ?
    Có cần xóa memcached khi cài varnish không ?

  7. Tran Tri 10 comment

    Lỗi rồi Luân ơi
    [root@vpsbk home]# curl -I demo.trongtri.com
    HTTP/1.1 200 OK
    Server: nginx
    Date: Wed, 10 Aug 2016 04:35:35 GMT
    Content-Type: text/html
    Content-Length: 613
    Last-Modified: Thu, 26 Feb 2015 09:01:55 GMT
    Connection: keep-alive
    Vary: Accept-Encoding
    ETag: “54eee103-265”
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    Accept-Ranges: bytes

  8. Tommy Nguyen 36 comment

    Hi Luân,
    Cài HOCVPS Script rồi, thì cài cái này cũng theo các bước này luôn hay bỏ qua step nào ko Luân?

    1. Luân Trần Admin

      Không bỏ qua bước nào hết nhé bạn. Tuy nhiên cài Varnish khá phức tạp nên bạn thử trên server test trước nha.

  9. Tử Vương 4 comment

    nó báo thế này là sao cậu
    http://prntscr.com/c0f8oh

    Not found
    Available: varnish-4.0.2-1.el6.x86_64 (varnish-4.0)
    Not found
    Installing: varnish-4.0.3-1.el6.x86_64 (varnish-4.0)
    Not found
    Available: varnish-libs-4.0.1-1.el6.x86_64 (varnish-4.0)
    Not found
    Available: varnish-libs-4.0.2-1.el6.x86_64 (varnish-4.0)
    Not found
    Installing: varnish-libs-4.0.3-1.el6.x86_64 (varnish-4.0)
    Not found
    You could try using –skip-broken to work around the problem
    You could try running: rpm -Va –nofiles –nodigest
    [root@zone5s home]# varnishd -V
    -bash: varnishd: command not found

  10. Minh Thanh 56 comment

    “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;”
    Mình không hiểu lắm đoạn này. giờ website không vào được lun anh ơi.

    server {
    listen 127.0.0.1:8080;
    server_name http://www.aloshop.net;
    rewrite ^(.*) http://aloshop.net$1 permanent;
    }
    server {
    listen 80 default_server;
    access_log off;
    # access_log /home/aloshop.net/logs/access.log;
    error_log off;
    # error_log /home/aloshop.net/logs/error.log;

    root /home/aloshop.net/public_html;
    index index.php index.html index.htm;
    server_name aloshop.net;

    location / {
    try_files $uri $uri/ /index.php?$args;
    }

  11. zmupnguyen 56 comment

    VPS mình 2GB ram đã cài OP và Memcached thì có cần cài Varnish nữa không ad, nếu cần thì làm sao để tháo cái Memcached ra ?

    Mình chạy khoảng 5 site trên dùng 1 vps. Lượt view chỉ khoảng 1-2k/ngày.

    Tks ad

  12. Minh Thanh 56 comment

    Mình chạy lệnh này thì báo lỗi như sau:( Ubuntu 14, Varnish 4, Nginx)

    root@SV002:~# varnishd -F -f /etc/varnish/default.vcl
    bind(): Address already in use
    bind(): Address already in use
    Error: Failed to open (any) accept sockets

    1. Luân Trần Admin

      Vậy là cú pháp file .VCL chuẩn rồi đó bạn, lỗi đó do Varnish đang chạy nên ko test được mà thôi.

  13. Bảo 17 comment

    Hi Luân,
    Mình sử dụng nhiều domain trên cùng 1 VPS
    Trước khi mình cài đặt varnish mình có cấu hình nginx để những tên miền khác chuyển hướng về cùng 1 tên miền.
    * mình chuyển hướng bằng cách sử file domain1.com.conf
    server_name domain1.com;
    server_name http://www.domain1.com;
    rewrite ^(.*)$ http://domain.com$1 redirect;
    —————
    Sau đó mình làm theo hướng dẫn ở Bài này, đến đoạn
    “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;”
    Mình có cấu hình lại toàn bộ các tên miền thành listen 127.0.0.1:8080;
    Sau đó restart nginx và mình test tên miền domain1.com không còn chuyển hướng đến domain.com nữa
    Có cách nào khắc phục không ạ ?

    1. Luân Trần Admin

      Bạn lưu ý cấu hình domain1.com.conf cũng phải add port vào nhé, nếu không Nginx sẽ dùng port 80. Ví dụ:

      server {
          listen 127.0.0.1:8080;
          server_name domain1.com;
          
          ....
      }
      1. Bảo 17 comment

        Đúng rồi, mình có add port listen 127.0.0.1:8080; cho domain1.com.conf, nhưng sau đó restart nginx và mình truy cập vào tên miền domain1.com thì KHÔNG còn chuyển hướng đến domain.com nữa
        Nó chỉ hiện ra trang index của Nginx

        1. Luân Trần Admin

          Bạn kiểm tra xem domain đang nhận block server {} nào rồi update lại tương ứng coi.

  14. Hiếu 11 comment

    Luân ơi, mình tạo VPS 8Gb- centOS 6.8×64 trên DigitalOcean, mình làm theo hướng dẫn của Luân, có 2 chỗ mình làm không được.
    1. “thread_pools mặc định 2, thay bằng số CPU Core” mình tìm ko ra chỗ này. Ví dụ: thread_pool_max bạn có ghi là “VARNISH_MAX_THREADS” nên mình tìm ra được
    2. Mình chạy lệnh dể biết được Varnish có đang hoạt động hay không:

    [root@centos-8gb-nyc3-01 home]# curl -I domain.com

    Hiện ra ntn:

    HTTP/1.1 301 Moved Permanently
    Date: Sun, 24 Jul 2016 18:24:01 GMT
    Server: Apache
    Location: http://www.domain.com/index.mas
    Cache-Control: max-age=14400
    Expires: Sun, 24 Jul 2016 22:24:01 GMT
    Vary: Accept-Encoding
    Content-Type: text/html; charset=iso-8859-1

    Khắc phục ntn vậy Luân, Luân chỉ mình với

    1. Hiếu 11 comment

      à, dòng thứ 2 mình đọc phía trên xử lý đc rồi, còn “thread_pools mặc định 2, thay bằng số CPU Core” mình vẫn chưa tìm ko ra chỗ này. Luân chỉ mình chỗ này với

    2. Hiếu 11 comment

      Với mình tính tạo VPS 8GB này để chứa nhiều website. Trước kia mình dùng Memcache, giờ tạo VPS mới chuyển tất cả website qua VPS cài Varnish liệu có sao không Luân

      1. Luân Trần Admin

        Chứa nhiều site thì cấu hình vất vả hơn một chút thôi, không sao nhé. Chạy Varnish thì nhanh bá đạo rồi.

        1. Hiếu 11 comment

          Mình ko biết về code nên chỉ nhìn theo bạn hướng dẫn và làm như cái máy, hi.

          Cấu hình vất hả hơn 1 chút là phải làm khác hay làm thêm chỗ nào vậy Luân, Luân hướng dẫn giúp mình với, mình search trên google rồi mà tìm ko thấy

          1. Luân Trần Admin

            Vất vả thêm khoản chỉnh sửa cấu hình cho từng site thôi. Nếu làm ngon 1 site rồi thì thoải mái

    3. Luân Trần Admin

      Bạn phải test bằng domain của bạn chứ sao lại lấy domain.com kia.
      thread_pools mình thấy phải setup dùng Varnish Agent mới được, chưa hiểu sao lại bị giấu kĩ thế?

  15. Bảo 17 comment

    Lạ thật, làm xong restart VPS, chạy lệnh test curl -I domain.com thì varnish hoạt động bình thường
    sau khi restart VPS lần nữa thì varnish k hoạt động ???
    Mình có thử chạy lệnh service varnish restart nhưng vẫn không được ??

          1. Luân Trần Admin

            Mình không thấy thông tin varnish trong header rồi, bạn check lại thử coi.

          2. Bảo 17 comment

            thì đúng rồi,
            như lúc đầu mình nói đó,
            “làm xong restart VPS, chạy lệnh test curl -I domain.com thì varnish hoạt động bình thường
            sau khi restart VPS lần nữa thì varnish k hoạt động ???”

  16. Thanh Bình 1 comment

    Làm theo cách của Luân không được rồi
    Mình dùng :
    yum install epel-release
    yum install varnish
    thì ok :* vì thiếu jemalloc

  17. Minh Thanh 56 comment

    Đã chạy lệnh curl -I http://localhost, nó xuất hiện cái này thì có hoạt động không a Luân:

    [root@SVR003 public_html]# curl -I http://localhost
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Thu, 21 Jul 2016 12:02:59 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Location: http://mydomain.net/
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff

    1. Luân Trần Admin

      Link này redirect rồi, bạn phải check đến link cuối cùng cơ. Thử lại với curl -I domain.com xem thế nào?

  18. sinhle 71 comment

    mình cài xong đến bước này.
    mở theo đường dẫn : nano /etc/varnish/varnish.params
    Thay đổi port để Varnish listen thành 80 ( không biết dòng nào trong varnish.params)
    Thay đổi port để Web server listen thành 8080, hoặc port bất kỳ bạn muốn ( không thấy trong varnish.params)
    Sau đó thêm dòng code này vào (VARNISH_STORAGE=”malloc,512M”) và save lại hay sao nhỉ? và tiếp tục làm .
    thanks ad

    1. Luân Trần Admin

      Phiên bản Varnish của bạn hiện tại là gì, cài trên OS nào thế? Mỗi cái nó có đường dẫn khác nhau đó.

      1. Nguyên Hào 22 comment

        Mình bị lỗi y như bạn này , mình dùng CENTOS7 và Varnich 4 , file varnish.params của mình ko có đoạn để thay port , thấy nó sai sai so với hướng dẫn của anh Luân . anh check giúp mình với nhé

        ================================

        # Varnish environment configuration description. This was derived from
        # the old style sysconfig/defaults settings

        # Set this to 1 to make systemd reload try to switch vcl without restart.
        RELOAD_VCL=1

        # Main configuration file. You probably want to change it.
        VARNISH_VCL_CONF=/etc/varnish/default.vcl

        # Default address and port to bind to. Blank address means all IPv4
        # and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted
        # quad, or an IPv6 address in brackets.
        # VARNISH_LISTEN_ADDRESS=192.168.1.5
        VARNISH_LISTEN_PORT=6081

        # Admin interface listen address and port
        VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
        VARNISH_ADMIN_LISTEN_PORT=6082

        # Shared secret file for admin interface
        VARNISH_SECRET_FILE=/etc/varnish/secret

        # Backend storage specification, see Storage Types in the varnishd(5)
        # man page for details.
        #VARNISH_STORAGE=”file,/var/lib/varnish/varnish_storage.bin,1G” ( đoạn này mình thay như hướng dẫn của anh Luân bằng đoạn dưới)
        VARNISH_STORAGE=”malloc,512M”

        # Default TTL used when the backend does not specify one
        VARNISH_TTL=120

        # User and group for the varnishd worker processes
        VARNISH_USER=varnish
        VARNISH_GROUP=varnish

        # Other options, see the man page varnishd(1)
        #DAEMON_OPTS=”-p thread_pool_min=200 -p thread_pool_max=5000 -p thread_pool_timeout=300″

  19. sinhle 71 comment

    Luân cho hỏi với. mình cài trên os7. khi chạy lệnh
    systemctl start varnish
    thì báo lỗi Failed to start varnish.service: Unit varnish.service failed to load: No such file or directory.
    Thanks.

  20. Linh 22 comment

    Mình làm tới varnishd -F -f /etc/varnish/default.vcl
    thì báo lỗi này bạn ơi
    Message from VCC-compiler:
    Symbol not found: ‘req.method’ (expected type BOOL):
    (‘input’ Line 18 Pos 13)
    if (req.method == “PURGE”) {
    ————##########————–

    Running VCC-compiler failed, exit 1

    VCL compilation failed

  21. Tpm 5 comment

    Mình thực hiện đúng theo hướng dẫn và test curl -I http://localhost cũng báo ok hết rồi. Nhưng khi truy cập vào tên miền thì không được, hình như lỗi 302 hay 502 gì đó. Đổi Web server listen về lại 80 thì truy cập được. vps mình dùng hocvps script. Không biết bị lỗi gì nhỉ ?

    1. Luân Trần Admin

      Bạn check lại port backend của varnish đã chuẩn chưa, service running chưa?

      1. Tpm 5 comment

        Mình gõ lệnh netstat -ntlup thì ra như ảnh này: http://i.imgur.com/fVWfRdV.jpg
        Ở file varnish thì mình để: VARNISH_LISTEN_PORT=80
        Còn default.vcl thì:
        backend default {
        .host = “127.0.0.1”;
        .port = “8080”;
        }
        Còn ở /etc/nginx/conf.d thì mình có mỗi file hello.com.conf đã sửa: listen 8080 rồi.
        Hình như là do cái nginx nó vẫn listen ở cổng 80. Nhưng mà mình không kiếm ở đâu thấy nữa ngoài cái file conf của tên miền kia. VPS mình mới setup rồi cài hocvps script với varnish luôn.

      2. Tpm 5 comment

        À chạy lệnh: varnishd -F -f /etc/varnish/default.vcl
        Thì nó ra thế này:
        WARNING: Taking over SHMFILE marked as owned by running process (pid=2055)
        bind(): Address already in use
        bind(): Address already in use
        Child start failed: could not open sockets

        1. Luân Trần Admin

          Bạn cần stop Nginx đi, rồi run Varnish để nó lấy quyền dùng port 80. Nginx đang chạy nên nó lấy port 80 rồi.

          1. Tpm 5 comment

            Hi Luân !
            Mình stop Nginx rồi run Varnish thì đúng là varnish đã lấy được quyền dùng port 80. Nhưng start nginx thì lại không được, lỗi như hình này: http://i.imgur.com/wi1pnNa.jpg
            Mình vừa tạo vps mới và cài hocvps script với varnish. Lúc cài hocvps script mình gõ tên miền là hello.com và chưa thêm 1 tên miền nào khác nên trong /etc/nginx/conf.d chỉ có mỗi file hello.com.conf đã sửa “listen 8080 default_server;” . Không hiếu sao nginx nó vẫn cứ đòi nghe qua cổng 80 nữa ?

          2. Tpm 5 comment

            Hi, mình tìm ra lỗi rồi. Lúc đầu file config thế này:
            server {
            server_name http://www.hello.com;
            rewrite ^(.*) http://hello.com$1 permanent;
            }
            server {
            listen 8080 default_server;
            ….
            }
            Cái khối server {} ở trên không ghi listen nên mặc định nó vẫn đòi dùng cổng 80 😀
            Cám ơn Luân nhiều nhé !

  22. John Kenny 23 comment

    cái Varnish này tương thích với sentora không Luân ơi. Vì đang sử dụng sentora thấy nó rất tốt, ổn định và có email server kèm theo.

      1. John Kenny 23 comment

        Bài này mình mới đọc qua. Luân cho mình hỏi cái là. Mình đã cài sentora rồi. Giờ cài thêm cái này nữa thì có sao không Luân? Hay phải reset lại vps cài lại từ đâu?

        1. Luân Trần Admin

          Nếu dùng Sentora thì bạn cài theo comment trước mình trả lời ấy, không dùng cách như ở bài này.

          1. Luân Trần Admin

            Link comment hướng dẫn kia dành cho Zpanel nhưng Sentora cũng tương tự kiểu thế. Tất nhiên là bạn phải cài Sentora rồi mới làm theo hướng dẫn đó được.

        2. John Kenny 23 comment

          Đã làm và đã thất bại. Làm đủ kiểu cũng không được.
          Luân ơi. Rãnh làm thử 1 phát rồi cho AE bài hướng dẫn đi Luân ơi. Thấy forum mình cũng nhiều người sử dụng sentora lắm.

          Giờ phải nhờ bên vps họ restore lại dữ liệu 😀

  23. TINKA 44 comment

    @luan: cảm ơn bạn vì bài viết này, nó đã giúp tôi cài đặt thành công varnish trên ngnix.( tôi đã cài varnish trên vps riêng, hiệu suất thật tuyệt, ram có 768 mà chạy còn nhanh hơn vps 1G ở VN.
    tôi có chút ý kiến :
    1. bạn nên sữa tiêu đề bài viết lại. Thêm 64Bit vào tiêu đề ==> theo cách trên sẽ không cấu hình được file /etc/varnish/default.vcl ===> vì nó không hỗ trợ hàm req.method trên ubuntu 32Bit.

    1. Luân Trần Admin

      Okie cảm ơn bạn, mình toàn dùng 64bit nên không nắm rõ được phần hỗ trợ hàm req.method 😀

  24. TINKA 44 comment

    @luan: nếu mình muốn cấu hình cho Varnish chạy trên 1 vps riêng, thì làm sao,
    bạn có thể làm bài hướng dẫn cụ thể không.

    mình thấy hay đó.

    1. Luân Trần Admin

      Cài đặt bình thường nhé, Chia Sẻ Coupon đang làm như vậy. Phần backend bạn cấu hình trỏ đến IP server chạy webserver thay vì IP localhost 127.0.0.1 là được.

      1. TINKA 44 comment

        @luân: chia sẽ này là ok, những chưa đủ, vì với 1 người mới như tôi thì botay, nhưng cuối cùng ,cũng xong .cảm ơn bạn nhìu.

        @ALL: nhớ mỡ ip nội mạng trên cả 2 vps nhé ( tôi phãi tìm hết tài liệu nước ngoài,mới hiểu được có mỗi đoạn đó)
        cái này do bác luân nghĩ ,mọi người đã có kiến thức cơ bản nên không nhắc đến .
        @ALL: mở ip NỘI MẠNG Ở 2 VPS =)))))

  25. Nam Luu 21 comment

    “rpm –nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
    yum update && yum –disablerepo=epel* –enablerepo=varnish* install varnish”

    Lênh Yum trên bị lỗi 404:
    https://repo.varnish-cache.org/redhat/varnish-4.0/el6/i386/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 404 Not Found”
    Trying other mirror.
    Error: Cannot retrieve repository metadata (repomd.xml) for repository: varnish-4.0. Please verify its path and try again

        1. Luân Trần Admin

          Mình dùng CentOS 6, cài HocVPS Script rồi cài Varnish theo đúng hướng dẫn trong bài đều ok.
          Không biết bạn dùng VPS có gì khác không?

          1. Nam Luu 21 comment

            Mình cài script hocvps và sử dụng centos 6.7 32bis

            Khi chạy đến lệnh trên thì lỗi 🙁

          2. Luân Trần Admin

            Ừ mình thử thấy lỗi thật, do Varnish rồi. Bạn dùng bản 64bit nhé, không bị lỗi thế này đâu.

          3. Nam Luu 21 comment

            Hiện tại mình đang có web trên vps rồi, giờ muốn up centos từ 32bit lên 64bit có bị mất dữ liệu ko. Mình dùng Digitalocean

            Có cách nào ko hướng dẫn giúp mình

          4. Luân Trần Admin

            Bạn backup lại toàn bộ web, tải xuống rồi Reinstall VPS. Vì cài lại sẽ mất hết dữ liệu.

  26. Huy Nguyen 3 comment

    Bac luân cho mình hỏi tí nhé, mình thấy trong W3 Total Cache có Varnish servers
    như vậy là mình có trể cài varnish trên 1 server rồi điền IP của server đó vào w3 tc, như vậy có đúng ko nhỉ,
    và cho mình hỏi thêm, mình có thể dùng 1 server varnish cho nhiều website đc ko

  27. Huy 3 comment

    Hi bac luân, cho mình hỏi vấn đề này tí, mình đã cài hocvps và tối ưu theo cách dùng memcached và W3 Total Cache
    Vậy thì khi cài thêm varnish thì có cần phải cài thêm Varnish HTTP Purge ko?
    có cần stop memcached và w3 ko?

    Cảm ơn bác nhiều

    1. Luân Trần Admin

      Cài memcached mình thấy khá là ok rồi, bạn xem có cần thiết phải dùng thêm Varnish nữa ko?

  28. lalalala 3 comment

    Mình cài thì báo lỗi như sau
    “The requested URL returned error: 404 Not Found”
    Trying other mirror.
    Error: Cannot retrieve repository metadata (repomd.xml) for repository: varnish-4.0. Please verify its path and try again

    1. Luân Trần Admin

      Mình thử thì thấy ok, có vẻ VPS của bạn có vấn đề rồi, thử ping sang site khác xem được ko?

    1. Luân Trần Admin

      Vậy bạn điều chỉnh lại cấu hình backend như sau xem ok ko:

      backend default {
          .host = "127.0.0.1";
          .port = "8080";
          .first_byte_timeout = 300s;
      }
      
      1. HUng 10 comment

        Điều chỉnh thế nào nhỉ?
        mặc định lúc cái nó như thế rồi mà ad

      2. HUng 10 comment

        nó vẫn thế này
        # varnishd -F -f /etc/varnish/default.vcl
        bind(): Address already in use
        bind(): Address already in use
        Error: Failed to open (any) accept sockets.

  29. HUng 10 comment

    chạy lệnh thì bị lỗi như này:
    # varnishd -F -f /etc/varnish/default.vcl
    bind(): Address already in use
    bind(): Address already in use
    Error: Failed to open (any) accept sockets.

      1. hgavnh 1 comment

        Bạn cho mình hỏi với, mình sài plugin WP WP Redirect Link trên vps sử dụng script của bạn lúc đầu bên host cũ thì nó vẫn chuyển link dạng http://domain.com/dtmp.php?link=http://domain.com nhưng bây giờ không chuyển được toàn báo lỗi
        No input file specified. chỉ mình cách khắc phục với

        1. Luân Trần Admin

          Bạn thử chạy menu “hocvps”, chọn chức năng số 14, Phân quyền webserver nhé

      2. HUng 10 comment

        vẫn lỗi vậy.
        Thêm một điều nữa là site mình truy cập ở ngoài thì bình thường ( có cache) trong khi phần post bài lài liên tục lỗi 502. đã sửa theo cách trên blog này mà vẫn ko được.
        thế nên cài thêm cái này xem thế nào mà lại cũng bị lỗi 🙁

    1. Luân Trần Admin

      Bạn thử chạy menu “hocvps” rồi chọn chức năng 14) Phan quyen webserver xem có ok không?

        1. Luân Trần Admin

          Mình hết dự đoán được rồi, nếu được bạn gửi mình thông tin login các thứ qua mail để mình check nhé,

  30. Tiến 5 comment

    Luân ơi cho mình hỏi khi sử dụng hocvps cài đặt thế nào để có thể download file trong thư mục public_html
    Mình thấy các file backup dc để trong private_html khi download phải thêm port mysql nữa.

      1. Tiến 5 comment

        Khi mình cài plug-in nó tạo ra file .csv lưu vào trong thư mục của plugin. mình bấm tải về toàn báo lỗi 404, hoặc khi muốn cho khách xem website download 1 tài liệu gì đó cũng k biết để vào đâu

        1. Luân Trần Admin

          Mình vẫn chưa hiểu cụ thể trường hợp sử dụng của bạn như thế nào để đưa ra phương án giải quyết. Bạn có thể chụp ảnh rồi gửi lại cho mình vào mail admin@hocvps để xem được chứ?

  31. Tuấn Anh 24 comment

    Chào Luân,

    Cho mình hỏi chút.

    Khi mình setup server dùng LEMP hay LAMP thì khi đăng nhập sftp bằng tài khoản root thì nó đưa thẳng vào thư mục root. mình phải quay tra và vào lại var/www/html chẳng hạn, rất mất time có các nào mà mình đăng nhập = root là vào thẳng html ko cậu ngoài tại shortcut…

    Mấy cái hosting hay dùng đó cậu.

    Thanks!

    1. Luân Trần Admin

      Đơn giản thôi, sau khi đăng nhập SSH với tài khoản root, bạn chạy lệnh sau để edit file nano .bashrc rồi chèn đoạn code sau xuống dưới cùng để nó tự di chuyển đến folder /home: cd /home
      Thử login lại xem kết quả nhé.

      1. Tuấn Anh 24 comment

        Thank cậu, mình làm được rồi, phải lưu cái này vào note mới đc 🙂

  32. Hoàng Huy 4 comment

    Luân ơi, chỗ này
    backend default {
    .host = “127.0.0.1”;
    .port = “8080”;
    }

    Mình đổi IP 127.0.0.1 thành 1 ip khác, ip đó là của 1 vps khác có được không Luân, tức mình chạy varnish trên 1 vps và chạy server trên 1 vps khác ấy. Dĩ nhiên server kia cũng listen ở port 8080.

    1. Luân Trần Admin

      Được nhé, nhưng tốt nhất nên sử dụng private IP thì sẽ cho kết nối nhanh hơn, đỡ bị x2 băng thông

      1. Hoàng Huy 4 comment

        Nếu vậy thì phải đặt chung một location rồi Luân nhỉ. Cám ơn Luân nhé 😀

      2. Hoàng Huy 4 comment

        Ah còn nữa Luân ơi, việc trỏ domain subdomain từ hocjvps khi truy xuất qua thằng nãy vẫn ok chứ Luân 😀

  33. Steve Diện 21 comment

    Trước mình vẫn dùng cái này nhưng dạo này cài SSL nên không biết cấu hình thế nào cho nó chạy với port 443, Luân hướng dẫn thêm được không 😀

      1. Steve Diện 21 comment

        Mình đọc trên Community của DO nó có nói dùng SSL Termination nhưng khó hiểu quá, Luân xem giải thích giúp mình cái 😀