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. Dũng 1 comment

    Định chuyển sang varnish mà benchmark cho ra kết quả kém quá
    VPS 1 core nginx proxy + disk cache mà RPS (Requests per second) gấp 2-3 lần varnish, multi-core cũng hơn khoảng 30% -> 40%
    Không rõ lên production thì ra sao, thôi vẫn xài nginx cho lành

  2. Ngọc Đức 4 comment

    Có thể cài varnish cache ngay trên vps đang host blog của mình được không ạ? hay phải cài trên 1 vps riêng biệt?

  3. hoang 1 comment

    Chào Ad
    Mình sử dụng Cloudflare và Cài Varnish như hướng dẫn của bạn. Đoạn code VCL của bạn Varnish nó không HIT nên mình thay bằng đoạn code ở link này thì HIT.
    https://gist.github.com/fevangelou/84d2ce05896cab5f730a
    Nhưng có một vấn đề là khi web chạy một thời gian thì trang web không vào được phải Clear Cache trong WP-admin thì mới vào được.
    Xin hướng khắc phục vấn đề này

  4. phuc nguyen 4 comment

    Ad giúp mình với.
    Sau khi debug thì mình thấy nếu thêm đoạn :
    ———————————————-
    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”‘;
    —————————————————
    Thì sẽ không khởi động được Nginx, Ad xem giúp mình với!

  5. jin do 1 comment

    Mình cài và kiểm tra 2 xem cái nào chiếm cổng 80 thì thấy :
    [root@vultr home]# netstat -tulpn | grep 80
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3407/varnishd
    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3008/nginx: master
    tcp6 0 0 :::80 :::* LISTEN 3407/varnishd

    Cái varnishd có tcp và tcp 6 .Xin hỏi giải quyết sao ạ

  6. Tuấn 8 comment

    1. anh ơi s e bị lỗi này v ạ, anh xem giúp em với. Em cảm ơn
    Connection failed (127.0.0.1:6082)
    Unable to run varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 vcl.list
    2. A cho e hỏi cái 127.0.0.1 là mình cứ làm y chang anh, k cần thay đổi gì phải không

    1. Việt Phương Moderator

      Thank bạn đã đóng góp. Mình đang edit dần cho cả phiên bản 4 và 6

  7. thang 22 comment

    cảm ơn mình cài được rồi thì mình nên sài plugin cache nào kết hợp với Vanish tối ưu Ad nhỉ WP rocket, W3 total , wp super cache… cảm ơn

    1. Việt Phương Moderator

      Tùy từng nhu cầu và khả năng nên mình không có tư vấn cụ thể được rồi

  8. Thang 22 comment

    mình chạy lệnh này có kết quả :[root@vultr home]# curl -I videocolours.com
    curl: (7) Failed connect to videocolours.com:80; Connection refused

    còn lệnh này sao ko ra kết quả: [root@vultr home]# netstat -lntp | grep 80
    -bash: netstat: command not found
    Admin và các bạn giúp mình với tks

    1. Việt Phương Moderator

      1. Website kia đang off nên không thể curl được. Bạn không thể kết nối vào website videocolours.com
      2. Bạn chưa cài netstat
      yum install net-tools

      1. Thang 22 comment

        mình cứ chuyển listen 80; thành listen 127.0.0.1:8080; là website bị lỗi ko vào được còn sửa lại như cũ thì bình thường vậy ad, tks

        1. Việt Phương Moderator

          1. Varnish bạn đã hoạt động và ở port 80 chưa? Và chuyển kết nối sang Nginx ở 8080 chưa
          2. Bạn truy cập thử domain:8080 ra kết quả gì không

          1. Thang 22 comment

            nội dung trong /etc/varnish/varnish.params như sau ổn chư 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=

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

            # 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=”malloc,512M”

            # 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=120″

            ->>mình kiểm tra các lệnh cũng thấy ok , mỗi tội ko vào website được ^^
            [root@vultr home]# netstat -lntp | grep 80.
            tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2504/nginx: master
            tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 2046/varnishd

            [root@vultr home]# netstat -lntp
            Active Internet connections (only servers)
            Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
            tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 785/exim
            tcp 0 0 0.0.0.0:43004 0.0.0.0:* LISTEN 2047/varnishd
            tcp 0 0 0.0.0.0:2018 0.0.0.0:* LISTEN 2504/nginx: master
            tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 774/php-fpm: master
            tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 785/exim
            tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 773/sshd
            tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2504/nginx: master
            tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 2046/varnishd
            tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 785/exim
            tcp6 0 0 :::25 :::* LISTEN 785/exim
            tcp6 0 0 :::3306 :::* LISTEN 1385/mysqld
            tcp6 0 0 :::587 :::* LISTEN 785/exim
            tcp6 0 0 :::2222 :::* LISTEN 773/sshd
            tcp6 0 0 :::45071 :::* LISTEN 2047/varnishd
            tcp6 0 0 :::465 :::* LISTEN 785/exim

            [root@vultr home]# varnishd -F -f /etc/varnish/default.vcl
            bind(): Address already in use
            bind(): Address already in use
            child (2535) Started
            Child (2535) said Child starts
            ^CManager got SIGINT
            Stopping Child
            Child (2535) died signal=2
            Child cleanup complete

            [root@vultr home]# curl -I videocolours.com
            curl: (7) Failed connect to videocolours.com:80; Connection refused

            cảm ơn admin

          2. Thang 22 comment

            như này là vẫn chưa dc hà AD? tại vì mình dùng
            [root@vultr home]# varnishd -F -f /etc/varnish/default.vcl
            vẫn trả về kết quả này

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

            —>>> còn kiểm tra thì :
            [root@vultr home]# curl -I videocolours.com

            HTTP/1.1 200 OK
            Date: Mon, 01 Oct 2018 18:49:26 GMT
            Content-Type: text/html; charset=UTF-8
            Vary: Accept-Encoding
            Set-Cookie: PHPSESSID=jua4ofra06to8tgi079lpo790l; path=/
            Expires: Thu, 19 Nov 1981 08:52:00 GMT
            Cache-Control: no-store, no-cache, must-revalidate
            Pragma: no-cache
            Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/
            Set-Cookie: weather_location=Singapore%2C+SG; expires=Wed, 31-Oct-2018 18:49:24 GMT; Max-Age=2592000; path=/
            Link: ; rel=”https://api.w.org/”
            Link: ; rel=shortlink
            X-Frame-Options: SAMEORIGIN
            X-XSS-Protection: 1; mode=block
            X-Content-Type-Options: nosniff
            X-Varnish: 88
            Age: 0
            Via: 1.1 varnish-v4
            X-Cache: MISS
            Access-Control-Allow-Origin: *
            Server: HocVPS Script
            Connection: keep-alive

            tks

          3. Việt Phương Moderator

            bind(): Address already in use
            Như này thì Varnish và 1 service nào đó vẫn đang cùng dùng chugn port gây xung đột. Bạn restart hết các service để kiểm tra nhé

          4. Thang 22 comment

            mình restart rối,có mỗi cái MariaDB (MySQL) restart báo failed thôi? mình chạy lệnh này Ad xem dùm có xung đột ko nhé, và mình nên làm gì để sửa nữa 2 bữa nay làm haoi2 chưa xong ^^ tks AD

            [root@vultr home]# netstat -lntp | grep 80
            tcp 0 0 0.0.0.0:2018 0.0.0.0:* LISTEN 8043/nginx: master
            tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 8067/php-fpm: maste
            tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 8043/nginx: master
            tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5723/varnishd
            tcp6 0 0 :::80 :::* LISTEN 7817/varnishd

            [root@vultr home]# netstat -lntp
            Active Internet connections (only servers)
            Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
            tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 785/exim
            tcp 0 0 0.0.0.0:2018 0.0.0.0:* LISTEN 8043/nginx: master
            tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 7816/varnishd
            tcp 0 0 127.0.0.1:37763 0.0.0.0:* LISTEN 5713/varnishd
            tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 8067/php-fpm: maste
            tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 785/exim
            tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 773/sshd
            tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 8043/nginx: master
            tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5723/varnishd
            tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 785/exim
            tcp6 0 0 :::25 :::* LISTEN 785/exim
            tcp6 0 0 ::1:37306 :::* LISTEN 5713/varnishd
            tcp6 0 0 :::3306 :::* LISTEN 1385/mysqld
            tcp6 0 0 :::587 :::* LISTEN 785/exim
            tcp6 0 0 :::2222 :::* LISTEN 773/sshd
            tcp6 0 0 :::80 :::* LISTEN 7817/varnishd
            tcp6 0 0 :::465 :::* LISTEN 785/exim

  9. Showa Online 2 comment

    Chào mod, mình đã làm y hệt hướng dẫn của bạn và đã coi rất kỹ về đụng port hay không nhưng ko đụng. Test thì mình cũng đã HIT thành công như hướng dẫn. Nhưng khi chạy lệnh nó cứ báo Failed to open any accpet sockets hoài không hiểu lý do sao. Mình check lại cũng 10 lần rồi ko có port nào trùng nhau. Không biết lỗi đó có thể bỏ qua được ko. Tại mình test curl -I thì thấy varnish hoạt động rồi. Mong admin cho lời khuyên. Thank ạ.

  10. Văn Hiếu 10 comment

    Chào Việt Phương,

    Mình gặp 3 vấn đề sau khi cài Varnish, bạn vui lòng hỗ trợ mính nhé.

    1. Mình cấu hình xong và nhập dòng lệnh “varnishd -F -f /etc/varnish/default.vcl” thì báo lỗi:
    bind(): Address already in use
    bind(): Address already in use
    Error: Failed to open (any) accept sockets.

    2. Khi mình cấu hình nginx phần “real_ip_header” thì nó báo có 2 cái “real_ip_header”
    – Cấu hình Varnish hoạt động với CloudFlare
    – Cài đặt Varnish

    + 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”‘;

    + real_ip_header CF-Connecting-IP;

    3. Khi mình test Varnish thì báo như sau:

    – Lệnh [curl -I domain.com]
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Fri, 03 Aug 2018 17:01:39 GMT
    Content-Type: text/html
    Content-Length: 178
    Connection: keep-alive
    Location: https://domain.com/

    – Lệnh [curl -I 127.0.0.1]
    HTTP/1.1 301 Moved Permanently
    Date: Fri, 03 Aug 2018 16:53:17 GMT
    Content-Type: text/html
    Content-Length: 178
    Location: https://starup.vn/
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    X-Varnish: 32820 32818
    Age: 600
    Via: 1.1 varnish-v4
    X-Cache: HIT
    Access-Control-Allow-Origin: *
    Server: VPS Starup
    Connection: keep-alive

    – Lệnh [curl -I starup.vn]
    HTTP/1.1 301 Moved Permanently
    Date: Fri, 03 Aug 2018 17:05:11 GMT
    Server: Varnish
    X-Varnish: 32831
    Location: https://starup.vn/
    Content-Length: 0
    Connection: keep-alive

    Bạn vui lòng cho mình hỏi mình cấu hình bị lỗi gì và cách khắc phục lại

    Cám ơn Bạn,

    1. Việt Phương Moderator

      Sai từ 1 rồi nên bắt đầu từ đó đi. Cổng đang được sử dụng
      Tức hiện tại cổng 80 của bạn vẫn bị Nginx và Varnish cùng sử dụng. Bạn kiểm tra lại toàn bộ các site Nginx nhé
      Và còn có vẻ bạn sử dụng cả hiện ip thật với Cloudflare, nếu vậy thì bạn không cài hiện ip thật với Varnish nữa

      1. Văn Hiếu 10 comment

        Cám ơn bạn đã hướng dẫn mình,

        Hiện tại mình cấu hình và có 1 số thông báo sau không biết có thành công chưa, bạn cho mình xin ý kiến nhé:

        1. Khi mình nhập lênh [curl -I starup.vn] hiển thị như sau:
        HTTP/1.1 301 Moved Permanently
        Date: Sat, 04 Aug 2018 09:24:54 GMT
        Content-Type: text/html
        Content-Length: 178
        Location: https://starup.vn/
        X-Frame-Options: SAMEORIGIN
        X-XSS-Protection: 1; mode=block
        X-Content-Type-Options: nosniff
        X-Varnish: 32780 16
        Age: 1
        Via: 1.1 varnish-v4
        X-Cache: HIT
        Access-Control-Allow-Origin: *
        Server: STARUP VPS
        Connection: keep-alive

        2. Khi mình nhập [varnishd -F -f /etc/varnish/default.vcl] hiển thị như sau:
        bind(): Address already in use
        bind(): Address already in use
        Error: Failed to open (any) accept sockets.

        3. Khi mình bật CloudFlare báo hiển thị như sau:
        HTTP/1.1 301 Moved Permanently
        Date: Sat, 04 Aug 2018 09:28:47 GMT
        Connection: keep-alive
        Cache-Control: max-age=3600
        Expires: Sat, 04 Aug 2018 10:28:47 GMT
        Location: https://starup.vn/
        Server: cloudflare
        CF-RAY: 444ffef066b9311a-SIN

        ——–
        Mình đã cấu hình đầy đủ Varnish làm việc với HTTPS, CloudFlare.
        – Bạn cho mình hỏi mình đã cấu hình thành công chưa vậy?
        – HTTP/1.1 301 Moved Permanently như vậy có ảnh hưởng gì không?

        Cám ơn Việt Phương nhiều lắm,

        1. Việt Phương Moderator

          1. Move vì HTTP không tồn tại, mọi truy vấn đã chuyển sang HTTPS rồi
          2. Bạn post file default.vcl ra, vẫn đang lặp port kìa

          1. Văn Hiếu 10 comment

            Việt Phương xem dùm mình sao vẫn bị Failed to open (any) accept sockets mãi hà:

            Active Internet connections (only servers)
            Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
            tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1200/nginx: master
            tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 1307/varnishd
            tcp 0 0 0.0.0.0:2727 0.0.0.0:* LISTEN 1200/nginx: master
            tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 763/php-fpm: master
            tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 781/exim
            tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 762/memcached
            tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 766/sshd
            tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1440/varnishd
            tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1200/nginx: master
            tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 781/exim
            tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 781/exim
            tcp6 0 0 :::3306 :::* LISTEN 1415/mysqld
            tcp6 0 0 :::587 :::* LISTEN 781/exim
            tcp6 0 0 :::2222 :::* LISTEN 766/sshd
            tcp6 0 0 :::80 :::* LISTEN 1440/varnishd
            tcp6 0 0 :::465 :::* LISTEN 781/exim
            tcp6 0 0 :::25 :::* LISTEN 781/exim
            [root@starup 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.

  11. Ngọc 3 comment

    Chào ad! Mình cài rồi mà thỉnh thoảng trên di động bị lỗi request_time_out (trong khi đó trên máy tính hoàn bình thường) Phải restart lại server mới hết lỗi. Không biết có phải do xung đột với cái gì không ad nhỉ? Trước đó mình đã biên dịch lại nginx theo chuẩn của google pagespeed. Mình có cách nào xem được network và console của di động như Cltrl + Shift + I trên máy bàn k nhỉ? Cám ơn ad!

    1. Showa Online 2 comment

      Tình hình sao rồi bạn, mình cũng config y hệt hướng dẫn và đã kiểm tra kỹ không trùng port nó vẫn báo y vậy. Chạy thì đã test varnish HIT thành công. Không hiểu sao.

    1. Trất Minh 38 comment

      Bác Cương vướng ở đoạn nào thế ạ? Bác lên thành công Varnish 4.1 chưa? Em làm theo hướng dẫn ở trang chủ là lên được rồi đó bác.

        1. Việt Phương Moderator

          Bạn cài trên CentOS nào? Tut thì mình chưa viết xong nên hiện chỉ trả lời qua comment được thôi

          1. Việt Phương Moderator

            Port 80 đang dùng. Bạn đã chuyển của Nginx sang khác port 80 chưa?

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

            Chào bác, em đã chỉnh theo cấu hình này rồi bác, em cần làm gì tiếp theo bác ?
            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

          3. Việt Phương Moderator

            Chắc để trống thôi. Hồi xài Nginx thì bạn cũng có phải cấu hình từng Nginx cho từng IP-Domain đâu

          4. Việt Phương Moderator

            Vẫn còn 1 block chưa sang 80. Có thể là block redirect bạn chưa chuyển. Block không ghi listen port gì thì bản chất nó vẫn là cổng 80 nhé