+1

Sử dụng FASTCGI Cache trong Nginx

Mở đầu

Nginx có nhiều tính năng thú vị được bật theo mặc định. Một trong số đó là bộ đệm FastCGI (FastCGI cache).

Điều tuyệt vời nhất về hệ thống bộ đệm này là nó không phụ thuộc vào bất kỳ ứng dụng hoặc plugin PHP-MySQL bên ngoài nào để phục vụ nội dung cho người dùng một cách nhanh chóng. Bạn thậm chí không phải phụ thuộc vào các giải pháp bộ đệm proxy như Varnish vì FastCGI Cache được lưu trữ và sử dụng bởi chính Nginx mà không có bất kỳ tương tác bên ngoài nào với các ứng dụng hoặc trình nền hệ thống (system daemons) khác.

Cơ chế hoạt động của nó giống như hầu hết các bộ nhớ cache khác. Nginx định nghĩa vùng nhớ chia sẻ FastCGI được sử dụng để lưu trữ các file bộ nhớ cache của chúng ta. Sau đó, chúng ta có thể định cấu hình PHP-FPM để sử dụng vị trí bộ đệm đó.

Bật FastCGI cache trên Nginx

Chỉnh sửa file cấu hình:

sudo vim /etc/nginx/nginx.conf

Thêm 2 dòng sau vào cuối file, bên trong block http {}:

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

Sau đó reload lại Nginx để thay đổi có tác dụng:

sudo service nginx reload

Rất đơn giản đúng không nào? Cụ thể thì

Đường dẫn fastcgi_cache_path dùng để xác định là vị trí nơi mà nội dung muốn cache sẽ được lưu trữ. keys_zone là một tên duy nhất (YOURAPP trong trường hợp này, đặt tên app của bạn chẳng hạn) để xác định vị trí bộ đệm.

Kích thước xác định là 100Mb (100m trong setting trên).

Tùy chọn inactive là 60 phút. Điều này có nghĩa là nếu dữ liệu cache không được truy cập trong vòng 60, thì file chứa nội dung cache đó sẽ bị xóa khỏi thư mục bộ nhớ đệm của FastCGI.

fastcgi_cache_key, chỉ định các file bộ nhớ cache sẽ được băm trong bao lâu.

Tích hợp bộ đệm FastCGI với PHP-FPM

PHP-FPM là một trong những PHP daemons phổ biến nhất được sử dụng với Nginx. Để cho PHP-FPM sử dụng các nội dụng từ bộ đệm FastCGI, bạn sẽ phải thêm hai dòng đơn giản vào cuối file cấu hình, bên trong khối server {} (thường nằm trong file cấu hình tại thư mục sites-available)

fastcgi_cache YOURAPP; 
fastcgi_cache_valid 200 60m;

Ở đây, biến số fastcgi_cache_valid được sử dụng để chỉ định thời gian lưu trữ cho các mã phản hồi khác nhau. Trong ví dụ này, bạn sẽ thấy mã phản hồi của header là 200. Đây là một ví dụ khác:

fastcgi_cache_valid 200 302 60m;
fastcgi_cache_valid 404      1m;

Tại đây, response code là 200 và 302 được thêm vào theo quy tắc 60 phút và response 404 có thời gian lưu trong bộ nhớ cache là 1 phút.

Một cấu hình PHP-FPM hoàn chỉnh với directive fastcgi_cache này sẽ trông giống như sau:

location ~ .php$ {
            try_files $uri =404;
            fastcgi_pass   unix:/tmp/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
            fastcgi_buffer_size 128k;
            fastcgi_buffers 256 4k;
            fastcgi_busy_buffers_size 256k;
            fastcgi_temp_file_write_size 256k;
            fastcgi_cache YOURAPP;
            fastcgi_cache_valid 200 60m;
        }

Chạy config test để xem mọi thứ có ổn không khi mà chúng ta đã setting nginx như thế:

sudo service nginx configtest

Nếu mọi thứ ổn, thì chúng ta reload lại nginx để áp dụng thay đổi:

sudo service nginx reload

Kiểm tra cache FastCGI có hoạt động hay không?

Chạy lệnh ls -alhR trong thư mục cache. để xem các file cache có được nginx sinh ra không:

ls -alhR /etc/nginx/cache

Làm sao để cache FastCGI từ RAM

Từ trên xuống đây, chúng ta có thể hiểu được là file cache được lưu trữ trong thư mục nào đó trên server, cũng đồng nghĩa là được lưu trữ và sử dụng bằng disk, thay vì RAM. Do đó, nếu dùng RAM để lưu cache thì chắc chắn sẽ nhanh hơn rất nhiều.

Chỉnh sửa file /etc/fstab, thêm vào cuối file dòng cấu hình sau:

tmpfs /etc/nginx/cache tmpfs defaults,size=100M 0 0

Trong ví dụ này thì chúng ta đã sử dụng 100 MB RAM để dành cho việc cache FastCGI. Có 1 điều lưu ý là, nếu mà server khởi động lại thì mọi thứ trong ram sẽ bị xóa, nếu cache được lưu trong ram thì sẽ phải cache lại từ đầu.

Sau đó, mount phân vùng RAM mới:

mount -a

Kiểm tra nó có hoạt động không bằng cách:

df -ah | grep tmpfs

Bạn sẽ thấy thứ tương tự như thế này:

Ở đây mình đã sử dụng 1% bộ nhớ cache trên ram rồi 😄

Kết luận


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí