Giới thiệu về Varnish Cache

Varnish Cache là là một dịch vụ tăng tốc ứng dụng web, nó đứng trước các truy vấn đến ứng dụng web như là một HTTP reverse proxy, lưu cache để giảm tải cho ứng dụng web (cache toàn bộ trang). Như thông tin từ trang https://varnish-cache.org/, Varnish Cache tăng tốc ứng dụng web từ 300 - 1000 lần.

Varnish Cache thiếu hỗ trợ SSL/TLS (https) nên sử dụng thực tế cấu hình phức tạp hơn để ứng dụng web của bạn vẫn được cache bởi Varnish Cache và vẫn hỗ trợ truy cập giao thức https. Trong phần này, hướng dẫn cài đặt - cấu hình Varnish Cache làm việc cùng Nginx trên CentOS với sơ đồ làm việc như sau:

vanish
  • Giả sử Server CentOS 7 có địa chỉ IP 192.168.10.56, bạn có thể triển khai Server này bằng cách sử dụng Vagrat (file Vagrant tham khảo) - cách dùng Vagrant xem tại Dùng Vagrant tạo máy ảo
  • Trên Server này cài đặt Nginx, PHP-FPM, Varnish Cache phối hợp làm việc với quy tắc: Nginx làm FrontEnd nhận các truy vấn https (nếu truy vấn http sẽ redirect sang https). Frontend này sẽ truy chuyển yêu cầu đến Varnish (cổng 6081), nếu truy vấn chưa được Cache thì Varnish gửi truy vấn đến khối Backend (Ứng dụng - ứng dụng web dùng Nginx ...) để lấy nội dung và cache
  • Trong ví dụ sủ dụng hai tên miền testvarnish1.net và testvarnish2.net trong đó cấu hình chỉ cache testvarnish1.net. Hai tên miền ảo này trỏ vào server 192.168.10.56 bằng cách thêm vào file hosts (/etc/hosts trên Linux, macOS hoặc C:\Windows\System32\Drivers\etc\hosts trên Windows)
    192.168.10.56 testvanish1.net
    192.168.10.56 testvanish2.net

Sau đây là các bước cài đặt, cấu hình để các thành phần của sơ đồ trên.

Cài đặt CentOS 7, PHP-FPM, Nginx

Chuẩn bị máy chủ Linux CentOS 7

Bạn có thể sử dụng VPS CentOS 7 nếu có hoặc sử dụng các phần mềm ảo hóa VMWare, VirtualBox để tạo máy ảo và cài đặt CentOS 7 để thực hành. Nhanh chóng thì sử dụng Vagrant tạo máy tảo VirtualBox chạy CentOS 7, chỉ việc lấy về file Vagrant sau đó chạy lệnh vagrant up để tạo tự động. Lưu ý địa chỉ IP đã cấu hình của máy là 192.168.10.56

Sau khi có Server, ssh vào (xem thêm sử dụng ssh) bằng tài khoản root và tiến hành cài đặt các thành phần tiếp theo

Cài đặt php-fpm 8 cho CentOS 7

Thực hiện các lệnh sau để cài đặt PHP 8 trên CentOS 7:

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils -y
yum-config-manager --disable remi-php54
yum-config-manager --enable remi-php80
yum -y install php php-fpm php-mysqlnd php-zip php-devel \
    php-gd php-mcrypt php-mbstring php-curl php-xml \
    php-pear php-bcmath php-json php-pdo php-pecl-apcu php-pecl-apcu-devel

systemctl start php-fpm
systemctl enable php-fpm

Cài đặt nginx cho CentOS 7

Thực hiện các lệnh sau để cài đặt Nginx trên CentOS 7

# Install Nginx
yum install epel-release -y
yum install nginx -y
systemctl start nginx
systemctl enable nginx

# Allow firewall
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Cấu hình PHP-FPM

Có thể cấu hình Nginx chạy PHP qua Socket hoặc qua cổng tpc 9200, ở đây chọn qua Socket, nên cần đảm bảo có file Socket khi PHP-FPM chạy, mở file cấu hình php-fpm ra

vi /etc/php-fpm.d/www.conf

Sửa listen có dạng (bỏ lắng nghe cổng 9200, thay bằng tạo file socket /var/run/php-fpm.sock)

; listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock

Đồng thời thêm vào cuỗi

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Sau đó kiểm khởi động lại php-fpm và xem trạng thái hoạt động của nó

systemctl restart php-fpm
systemctl status php-fpm
php fpm

Cấu hình nginx

Mở file cấu hình /etc/nginx/nginx.conf xóa đi khối server trong khối http, để loại bỏ server mặc định, sau đó lưu lại

Tạo ssl certificate: Với mục đích dùng https, sẽ tạo ra tự xác thực ssl (nếu domain thật bạn dùng Let's Encrypt miễn phí ), chạy các lệnh sau:

yum install mod_ssl openssl -y
mkdir /certs/
cd /certs/
openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Bạn có 2 file /certs/ca.crt/certs/ca.key để cấu hình SSL cho Nginx

Cấu hình kiểm tra testvanish2.net - trường hợp này cấu hình site chạy thông thường không có sử dụng cache

Tạo ra file /etc/nginx/conf.d/site2.conf, nội dung file này như tại /etc/nginx/conf.d/site2.conf

Trong file này định nghĩa hai khối server, thứ nhất lắng nghe cổng 443 nhận các yêu cầu https, file php thi hành bằng cách chuyển cho socket unix:/var/run/php-fpm.sock, khối này sử dụng tự xác thực ssl ở trên. Khối server thứ 2 chuyển hướng http://testvanish2.net sang https://testvanish2.net

Khởi động lại nginx

systemctl restart nginx

Tạo ra file /var/www/html/site2/index.php để kiểm tra

<?php
  echo "\nTest site1\n";
  echo date('l jS \of F Y h:i:s A');
  echo "\n";

Truy cập địa chỉ https://testvanish2.net để thấy rằng nginx và php-fpm đã làm việc chính xác

Cài đặt và sử dụng Varnish Cache cơ bản

Cài đặt Varnish Cache

Thực hiện các lệnh sau

yum install -y epel-release
yum install varnish -y
systemctl start varnish
systemctl enable varnish
systemctl status varnish

Mở file /etc/varnish/default.vcl bằng lệnh vi, cập nhật, đảm bảo có khối

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

Có nghĩa là Varnish Cache sẽ truy cập 127.0.0.1:8080 (nginx) để lấy nội dung nếu chưa cache

Tiếp theo, mở /etc/varnish/varnish.params, cập nhật

VARNISH_LISTEN_ADDRESS=127.0.0.1
VARNISH_LISTEN_PORT=6081

Có nghĩa là Varnish Server lắng nghe ở 127.0.0.1:6081, sau đó khởi động lại Varnish

systemctl restart varnish

Có thể kiểm tra các dịch vụ đã chạy ở các cổng chính xác chưa với lệnh

netstat -pnltu

Nếu lệnh này chưa có, cài thêm vào bằng

yum install net-tools -y
vanish

Cấu hình Nginx sử dụng Varnish Cache

Tạo ra file /etc/nginx/conf.d/site1.conf, nội dung file này như tại /etc/nginx/conf.d/site1.conf

Nó gồm có ba khối server với các chức năng

Cấu hình để testvanish1.net hoạt động ở cổng 8080, chỉ cho truy cập localhost, khối này nhận request từ Varnish Cache trả nội dung cho Varnish Cache

server {
    listen 127.0.0.1:8080;
    root /var/www/html/site1;
    index index.php index.html index.htm;
    server_name testvanish1.net;
    set_real_ip_from   127.0.0.1;
    real_ip_header     X-Forwarded-For;
    real_ip_recursive on;

    location / {
      try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /404.html {
      root /var/www/errors;
      internal;
    }

    # pass the PHP scripts to FastCGI server listening on socket
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ {
        expires 5d;
    }

    # deny access to . files, for security
    location ~ /\. {
        log_not_found off;
        deny all;
    }

}

Khối tiếp theo, cấu hình cho https://testvanish1.net, nó truy vấn đến Varnish Cache để lấy nội dung trả về cho client

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2 ipv6only=on; ## listen for ipv6

    root /var/www/html/site1;
    index index.php index.html index.htm;

    ssl_certificate     /certs/ca.crt;
    ssl_certificate_key /certs/ca.key;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    server_name testvanish1.net;
    # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
    sendfile off

    # Proxy Pass to Varnish
    # Add headers to recognize SSL
    location / {
        proxy_pass  http://127.0.0.1:6081;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Secure on;
    }
}

Khối cuối chuyển hướng http sang https

server {
    listen 80;
    server_name testvanish1.net;
    return 301 https://testvanish1.net$request_uri;
}

Tạo ra file /var/www/html/site1/index.php để kiểm tra

<?php
  echo "\nTest Varnish Cache\n";
  echo date('l jS \of F Y h:i:s A');
  echo "\n";

Truy cập https://testvanish1.net để kiểm tra, bạn thấy nội dung đã được cache bởi Varnish

vanish

Vài lệnh quản lý Varnish Cache

varnishadm

Lệnh quản lý dịch vụ Varnish Cache, trong đó có các lệnh con quản lý Varnish, gõ help để xem các lệnh này và quit để thoát

Để xem log theo thời gian thực thực hiện lệnh

varnishlog

Ngoài ra còn có các lệnh thống kê, theo dõi Varnish theo thời gian thực như varnishstat, varnishhist, varnishtop


Đăng ký nhận bài viết mới