Trang chủ Linux WebserverApache [CentOS/RHEL] Cài Varnish trên webserver cho Apache/NGINX

[CentOS/RHEL] Cài Varnish trên webserver cho Apache/NGINX

bởi Thạch Phạm
14 bình luận 3014 views
Khuyến mãi hosting

Tiếp theo trong serie này, nếu bạn đang sử dụng hệ điều hành CentOS 6 hoặc RHEL 6 và dùng Apache hoặc NGINX để làm webserver thì mình sẽ hướng dẫn các bạn cách cài đặt Varnish vào và cài đặt nó để làm việc với webserver của bạn. Do cách cài đặt hoàn toàn giống nhau nên mình sẽ dùng 1 bài này mà hướng dẫn luôn cho cả Apache và NGINX thay vì viết bài thêm.

Tham khảo:

Trước hết mình nhắc lại là trong serie Varnish này mình sẽ chỉ hướng dẫn với Varnish 3 nên bây giờ chúng ta cũng sẽ cài Varnish 3 vào máy chủ, tránh cài Varnish 2 hoặc Varnish 4 thì các cấu hình sẽ hơi khác nên dễ gây lỗi.

Cài đặt Varnish

Để cài Varnish 3, bạn hãy nạp package của họ vào:

rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-3.0.el6.rpm

Và cài Varnish qua lệnh yum:

yum install varnish

Khi làm việc với CentOS/RHEL thì đừng quên cho một software nào đó tự khởi động khi reboot nhé:

chkconfig varnish on

Tiếp tục mở file /etc/sysconfig/varnish và tìm đoạn dưới đây ở phần Alternative 3:

VARNISH_LISTEN_PORT=6081

Đổi 6081 thành 80:

VARNISH_LISTEN_PORT=80

Tiếp tục mở file /etc/varnish/default.vcl và sửa đoạn backend default thành thế này:

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

Và xóa toàn bộ các đoạn bên dưới rồi thay bằng đoạn này:

acl purge {
    "127.0.0.1";
    "IP của máy chủ của bạn";
}
sub vcl_recv {

    # Allow purging
    if(req.request == "PURGE"){
        if(!client.ip ~ purge){
            error 405 "Purging not allowed.";
        }
        return(lookup);
    }

    # Lưu cache các tập tin này cho toàn bộ users
    if ( req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$" ) {
        unset req.http.cookie;
    }

    # Không load cache cho những thành viên đăng nhập (dùng cookie wordpress_logged_in)
    if ( req.http.cookie ~ "wordpress_logged_in" || req.url ~ "vaultpress=true" ) {
        return( pass );
    }

    # Drop các cookie gửi đến WordPress
    if ( ! ( req.url ~ "wp-(login|admin)" ) ) {
        unset req.http.cookie;
    }

    # Handle compression correctly. Different browsers send different
    # "Accept-Encoding" headers, even though they mostly all support the same
    # compression mechanisms. By consolidating these compression headers into
    # a consistent format, we can reduce the size of the cache and get more hits.
    # @see: http://varnish.projects.linpro.no/wiki/FAQ/Compression
    if ( req.http.Accept-Encoding ) {

        if ( req.http.Accept-Encoding ~ "gzip" ) {
            # If the browser supports it, we'll use gzip.
            set req.http.Accept-Encoding = "gzip";
        }

        else if ( req.http.Accept-Encoding ~ "deflate" ) {
            # Next, try deflate if it is supported.
            set req.http.Accept-Encoding = "deflate";
        }

        else {
            # Unknown algorithm. Remove it and send unencoded.
            unset req.http.Accept-Encoding;
        }

    }

}

sub vcl_fetch {
    # Thiết lập cho cache live trong 10 tiếng, mặc định là 2 phút.
    set beresp.ttl = 10h;
    # Drop any cookies WordPress tries to send back to the client.
    if ( ! req.url ~ "wp-(login|admin)" && ! req.http.cookie ~ "wordpress_logged_in" ) {
        unset beresp.http.set-cookie;
    }

}

sub vcl_miss {
    if(req.request == "PURGE"){
        purge;
        error 200 "Purged";
    }
}

sub vcl_hit {
    if(req.request == "PURGE"){
        purge;
        error 200 "Purged";
    }
}

sub vcl_deliver {
        if(obj.hits > 0) {
                set resp.http.X-Varnish-Cache = "HIT ("+obj.hits+")";
        } else {
                set resp.http.X-Varnish-Cache = "MISS";
        }
}

Cấu hình cho Apache

Bây giờ bạn hãy mở file /etc/httpd/conf/httpd.conf và tìm lần lượt 2 đoạn này:

Listen 80
.....
NameVirtualHost *:80

Sửa thành

Listen 8080
.....
NameVirtualHost *:8080

Tiếp theo hãy sửa toàn bộ port có trong các VirtualHost của bạn từ 80 sang 8080 hết. Ví dụ:

<VirtualHost *:8080>
ServerAdmin contact@thachpham.com
DocumentRoot /home/webdata/thachpham.com/public_html
ServerName www.thachpham.com
ServerAlias thachpham.com
ErrorLog logs/thachpham.com-error_log

   <Directory />
            Options Indexes FollowSymLinks MultiViews
            # changed from None to FileInfo
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

</VirtualHost>

Bây giờ hãy khởi động lại Apache và Varnish:

service httpd restart
service varnish restart

Kiểm tra port xem Varnish đã dùng cổng 80 và Apache đã dùng cổng 8080 hay chưa:

[root@varnish ~]# netstat -ntlup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      12143/varnishd
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      11462/mysqld
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      12144/varnishd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1307/sshd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      971/master
tcp        0      0 :::80                       :::*                        LISTEN      12144/varnishd
tcp        0      0 :::8080                     :::*                        LISTEN      12111/httpd
tcp        0      0 :::22                       :::*                        LISTEN      1307/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      971/master

Ok, đã thành công! thử kiểm tra HTTP Header của website

[root@varnish ~]# curl -I https://thachpham.com/wordpress/
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.4.36
X-Pingback: https://thachpham.com/wordpress/xmlrpc.php
Content-Type: text/html; charset=UTF-8
Content-Length: 7351
Accept-Ranges: bytes
Date: Tue, 20 Jan 2015 23:34:19 GMT
X-Varnish: 567877718 567877710
Age: 12
Via: 1.1 varnish
Connection: keep-alive
X-Varnish-Cache: HIT (2)

Cấu hình cho NGINX

Đối với NGINX thì bạn mở toàn bộ file cấu hình domain của bạn lên và tìm listen 80 rồi đổi thành listen 8080 hết. Ví dụ:

server {
    listen       8080;
    server_name  www.abcxyz.com abcxyz.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    error_log               /home/nginx/abcxyz.com/log/error.log      error;

    root   /home/nginx/abcxyz.com/public_html;

    location / {

    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    include /etc/nginx/conf.d/php.conf;
    include /etc/nginx/conf.d/staticfiles.conf;
    include /etc/nginx/conf.d/block.conf;
}

Và vẫn khởi động lại Varnish và NGINX

service nginx restart
service varnish restart

Cài plugin xóa cache Varnish cho WordPress

Nếu bạn sử dụng WordPress thì sẽ cần Varnish tự xóa cache của trang chủ, post,…khi đăng bài mới. Do vậy, bạn hãy cài plugin Varnish HTTP Purge vào và không cần tùy chỉnh gì thêm vì plugin này không có tùy chọn gì cả.

Plugin này sẽ xóa các cache:

  • Trang chủ.
  • Post/Page được chỉnh sửa.
  • Các tag và category chứa post được chỉnh sửa.

Ngoài ra nó cũng xóa cache khi:

  • Sửa/cập nhật permalink.
  • Đổi theme.
  • Ấn nút “Purege Varnish Cache” ở ngoài Dashboard.
  • Ấn nút “Purge Varnish” trên thanh Admin Bar.

Hãy nhớ rằng cache sẽ không xóa hết cùng lúc mà sẽ xóa từ từ nên ví dụ bạn vừa mới sửa bài thì cache có thể còn lưu bài đó thêm 1, 2 phút nữa.

Nếu bạn đang sử dụng các dịch vụ proxy như CloudFlare, Incapsula thì hãy khai báo thêm đoạn này vào file wp-config.php:

define('VHP_VARNISH_IP','127.0.0.1');

 Lời kết

Sau khi cài xong, bạn thấy tốc độ website của bạn trên Apache như thế nào so với hình thức cache thông thường? Mình thì thấy có cảm giác nó nhanh và nhẹ hơn đi rất nhiều. Nếu bạn sử dụng NGINX Webserver (LEMP) trên CentOS thì đừng vội thất vọng vì mình có viết hướng dẫn Varnish cho NGINX trên CentOS ở phần sau.

14 bình luận

Có thể bạn quan tâm

0 0 vote
Article Rating
guest
14 Comments
mới nhất
cũ nhất đánh giá nhiều
Inline Feedbacks
View all comments

[…] [CENTOS/RHEL] CÀI VARNISH TRÊN WEBSERVER CHO APACHE/NGINX […]

Cường

Add cho hỏi varnish có cài được trên centminmod script không vậy, nếu có thì cho mình xin hướng dẫn được không

dave

[root@topmtv varnish]# varnishd -C -f /etc/varnish/default.vcl
Message from VCC-compiler:
Symbol not found: ‘req.request’ (expected type BOOL):
(‘input’ Line 14 Pos 8)
if(req.request == “PURGE”){
——-###########————-

Running VCC-compiler failed, exited with 2

VCL compilation failed
[root@topmtv varnish]#

dave

https://help.poralix.com/articles/nginx-varnish-apache-on-directadmin

Sau khi tìm tòi thì ra rồi, update cho bác nào cần

dave

VPS mình dùng centos 6.4 32bits, cài directadmin và có apache_nginx làm webserver, cài thành công Varnish ko gặp lỗi gì, nhưng start varnish báo FAILED!! ad có check thử chưa?

Duc

Theo như bài hướng dẫn của bạn thì đây chỉ là cấu hình cho một site trên vps và website sử dụng là wordpress. Nhưng nếu trên vps của mình có nhiều website khác nhau, liệu có thể cấu hình để có web thì cho phép dùng varnish cache có web thì không được không? Các website lại sử dụng các cms khác nhau như wordpress, drupal… vậy phải khai báo tất cả các quy tắc ứng với từng loại cms trong file /etc/varnish/default.vcl luôn đúng không.

Quynh

Bạn cho mình cấu hình varnish cache cùng lúc nhiều domain với. Mình đã thử nhiều nhưng cứ làm xong lại restart failed

Hung

Thạch cho hỏi là làm thế nào để cấu hình chạy server của Varnish một nợi và Web server 1 nơi.
Hiện tại đã cài web server ở Mỹ và Server Varnish ở Việt Nam

hanh

Bạn Thạch phạm ơi !

Cho mình hỏi một câu : giả sử mình có 3 virtualhost, mình chỉ muốn 2 virtualhost sử dụng Varnish Cache, còn 1 cái thì không sử dụng ? trong trường hợp này thì mình cấu hình thế nào ?

hanh

Thanks you

Phước

Varnish Cache có hoạt động vớ https không vậy bạn? Mình check xem web của mình có chạy varnish chưa bằng web http://www.isvarnishworking.com/ thì nó báo không hổ trợ https

Hoàng Anh

Mình sử dụng directadmin dùng apache 2.4 làm Reverse proxy có cài được Varnish theo hướng dẫn này không nhỉ?

14
0
Would love your thoughts, please comment.x
()
x