Hướng dẫn cài đặt Varnish cho Nginx/Apache trên CentOS/Ubuntu
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ý.
Nội dung bài viết
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 Ubuntuaptitude update && aptitude install varnishVới CentOS 6
yum install epel-release rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm yum install varnishVới CentOS 7
yum install epel-release yum install varnishSau 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:
- Ubuntu: 3.0.2-1
- CentOS: v4.0.3
varnishd -V
varnishd (varnish-4.0.3 revision b8c4a34) Copyright (c) 2006 Verdens Gang AS Copyright (c) 2006-2014 Varnish Software ASXem 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.xchkconfig --add varnish chkconfig varnish onVớ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.
/etc/varnish/default.vcl
Quy trình tiến hành cấu hình Varnish như sau:
- 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
- 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" |
- 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
nano /etc/varnish/default.vclThay 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.vclKhi 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 reloadhoặ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 8080Web 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 |
/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.confThay đ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.comLần đầu tiên chạy, để ý dòng X-Varnish bạn sẽ thấy một số, ví dụ:
X-Varnish: 1482416538hoặ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 1482416538hoặc
X-Cache: HIT
Ngoài ra, bạn cũng có thể sử dụng 2 công cụ:
- varnishlog: xem Varnish logsreal time
- varnishstat: hiển thị tình trạng cache Varnish