Hotline : 07 088 44444
Thích
Chia sẻ

Cài đặt Nginx FastCGI Cache trên VPS nhanh và dễ dàng

10/04/2021

Để biết cách cài đặt Nginx FastCGI Cache trên VPS, chúng ta hãy tìm hiểu Nginx là gì. Nginx bao gồm một FastCGI module có các chỉ thị để caching dynamic content được xử lý từ PHP backend. Việc setting này loại bỏ nhu cầu về các giải pháp page caching bổ sung như reverse proxies (Varnish) hoặc các plugin dành riêng cho app. Content cũng có thể được loại trừ khỏi caching dựa trên request method, URL, cookie hoặc bất kỳ server variable nào khác.

Enable Nginx FastCGI Cache trên VPS

Cài đặt Nginx FastCGI Cache trên VPS
Cài đặt Nginx FastCGI Cache trên VPS

Đầu tiên, bạn phải setup và configure Nginx với PHP trên server trước. Edit file cấu hình của Virtual Host mà caching phải được enabled.

nano /etc/nginx/sites-enabled/vhost

Thêm các dòng sau vào đầu file bên ngoài lệnh server { }:

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Lệnh “fastcgi_cache_path” chỉ định vị trí của bộ nhớ cache (/etc/nginx/cache), size của nó (100m), memory zone name (MYAPP), level thư mục con và thời gian inactive.

Lưu ý:

Vị trí có thể ở bất kỳ đâu trên hard disk. Tuy nhiên, size phải nhỏ hơn RAM + Swap của server. Nếu không, bạn sẽ nhận được một error có nội dung “Cannot allocate memory”. Chúng ta sẽ xem xét option “levels” trong phần purging. Nếu bộ nhớ cache không được truy cập trong một khoảng thời gian cụ thể (60 phút) được chỉ định bởi option “inactive” , thì Nginx sẽ xóa bộ nhớ cache đó.

Lệnh “fastcgi_cache_key” chỉ định cách các cache filename sẽ bị hashed. Nginx mã hóa “key” một file được truy cập bằng MD5 để làm tên file cache.

Tiếp theo, di chuyển lệnh location, chuyển các PHP request sang php5-fpm. Bên trong “location ~ .php $ {}” thêm các dòng sau.

fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;

Lệnh “fastcgi_cache” tham chiếu đến memory zone name mà chúng ta đã chỉ định trong lệnh “fastcgi_cache_path” và store bộ nhớ cache trong vùng này.

Theo mặc định, Nginx store các cached object trong một khoảng thời gian được chỉ định bởi bất kỳ các header nào sau đây: X-Accel-Expires / Expires / Cache-Control.

Lệnh “fastcgi_cache_valid” được sử dụng để chỉ định cache lifetime mặc định nếu các header này bị thiếu. Trong câu lệnh mà chúng ta đã nhập ở trên, chỉ những response có status code 200 mới được cached. Các response code khác cũng có thể được chỉ định.

Thực hiện kiểm tra cấu hình

service nginx configtest

Reload Nginx nếu mọi thứ đều ổn

service nginx reload

File vhost hoàn chỉnh sẽ giống như sau:

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    listen   80;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name example.com;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_cache MYAPP;
        fastcgi_cache_valid 200 60m;
    }
}

Tiếp theo, ta sẽ thực hiện một bài kiểm tra để xem caching có hoạt động hay không.

Thử nghiệm Nginx FastCGI Cache trên VPS

Tạo một file PHP output ra một UNIX timestamp.

/usr/share/nginx/html/time.php

Insert

<?php
echo time();
?>

Request file này nhiều lần bằng curl hoặc web browser của bạn.

root@droplet:~# curl http://localhost/time.php;echo
1382986152
root@droplet:~# curl http://localhost/time.php;echo
1382986152
root@droplet:~# curl http://localhost/time.php;echo
1382986152

Nếu caching hoạt động bình thường, bạn sẽ thấy cùng một timestamp trên tất cả các request khi response được cached. </br> </br>

Thực hiện một recursive listing về vị trí bộ nhớ cache để tìm bộ nhớ cache của request này.

root@droplet:~# ls -lR /etc/nginx/cache/
/etc/nginx/cache/:
total 0
drwx------ 3 www-data www-data 60 Oct 28 18:53 e

/etc/nginx/cache/e:
total 0
drwx------ 2 www-data www-data 60 Oct 28 18:53 18

/etc/nginx/cache/e/18:
total 4
-rw------- 1 www-data www-data 117 Oct 28 18:53 b777c8adab3ec92cd43756226caf618e

Quy ước đặt tên sẽ được giải thích trong phần purging.

Chúng ta cũng có thể làm cho Nginx thêm “X-Cache” header vào response, cho biết bộ nhớ cache có bị bỏ sót hoặc bị tấn công hay không.

Thêm lệnh sau bên trên server{}:

add_header X-Cache $upstream_cache_status;

Reload Nginx service và thực hiện một verbose request với curl để xem header mới.

root@droplet:~# curl -v http://localhost/time.php
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /time.php HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 29 Oct 2013 11:24:04 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Cache: HIT
<
* Connection #0 to host localhost left intact
1383045828* Closing connection #0

Cài đặt các ngoại lệ cache

Một số dynamic content, chẳng hạn như các page yêu cầu xác thực sẽ không được cached. Content như vậy có thể bị loại trừ khỏi bộ nhớ cache dựa trên các server variable như “$request_uri”, “$request_method” và “$http_cookie.”

Đây là cấu hình mẫu phải được sử dụng trong server {} context

#Cache everything by default
set $no_cache 0;

#Don't cache POST requests
if ($request_method = POST)
{
    set $no_cache 1;
}

#Don't cache if the URL contains a query string
if ($query_string != "")
{
    set $no_cache 1;
}

#Don't cache the following URLs
if ($request_uri ~* "/(administrator/|login.php)")
{
    set $no_cache 1;
}

#Don't cache if there is a cookie called PHPSESSID
if ($http_cookie = "PHPSESSID")
{
    set $no_cache 1;
}

Để áp dụng “$no_cache” variable cho các lệnh thích hợp, hãy đặt các dòng sau bên trong location ~ .php $ {}

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

Lệnh “fasctcgicachebypass” bỏ qua cache hiện có cho các request liên quan đến các điều kiện do chúng ta đặt trước đó. Lệnh “fastcginocache” không lưu vào bộ nhớ cache của request nếu các điều kiện cụ thể được đáp ứng.

Purging Cache

Quy ước đặt tên của bộ nhớ cache dựa trên các variable mà chúng ta đặt cho lệnh “fastcgi_cache_key”.

fastcgi_cache_key "$scheme$request_method$host$request_uri";

Theo các variable này, khi chúng ta request “http: //localhost/time.php”, giá trị sau sẽ là giá trị thực:

fastcgi_cache_key "httpGETlocalhost/time.php";

Chuyển chuỗi này qua MD5 hashing sẽ output ra chuỗi sau:

b777c8adab3ec92cd43756226caf618e

Điều này sẽ tạo thành filename của bộ nhớ cache như đối với các thư mục con mà ta đã nhập “levels = 1: 2”. Do đó, level đầu tiên của thư mục sẽ được đặt tên bằng 1 ký tự (tính từ cuối về trước) của chuỗi MD5 này. Trong trường hợp này là kí tự e. Level thứ hai sẽ có 2 kí tự liền kề đằng trước level đầu tiên, tức là 18. Do đó, toàn bộ cấu trúc thư mục của cache này như sau:

/etc/nginx/cache/e/18/b777c8adab3ec92cd43756226caf618e

Dựa trên cache naming format này, bạn có thể phát triển một purging script bằng ngôn ngữ yêu thích của mình. Đối với hướng dẫn này, tôi sẽ cung cấp một PHP script đơn giản để purge bộ nhớ cache của một POSTed URL.

/usr/share/nginx/html/purge.php

Nội dung file

<?php
$cache_path = '/etc/nginx/cache/';
$url = parse_url($_POST['url']);
if(!$url)
{
    echo 'Invalid URL entered';
    die();
}
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
$hash = md5($scheme.'GET'.$host.$requesturi);
var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
?>

Gửi một POST request tới file này với URL để purge.

curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php

Script sẽ output true hoặc false dựa trên việc bộ nhớ cache có được purged hay không. Đảm bảo loại trừ script này khỏi bộ nhớ cache và cũng hạn chế quyền truy cập.

Hy vọng những hướng dẫn trên giúp bạn cách cài đặt Nginx FastCGI Cache trên VPS một cách dễ dàng và nhanh chóng.

Xem thêm một số bài viết liên quan:

Hướng dẫn cấu hình NGINX cache

Nếu bạn có thắc mắc hay có vấn đề cần hỗ trợ, bạn có thể liên hệ trực tiếp với Vietnix thông qua các kênh sau:
  • Hotline: 1800 1093 - 07 088 44444
  • Email: support@vietnix.vn
  • Hoặc chat trực tiếp với Vietnix thông qua biểu tượng Livechat ở góc phải màn hình. Đội ngũ chuyên viên của chúng tôi luôn sẵn sàng tư vấn và hỗ trợ bạn 24/7.
Vietnix hiện đang có chương trình khuyến mãi lớn nhất trong năm, giảm giá TRỌN ĐỜI: Đăng ký dùng thử ngay và Vietnix sẽ hoàn tiền 100% nếu quý khách không hài lòng với chất lượng sản phẩm, dịch vụ!
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PersonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments