Thiết lập Nginx FastCGI Cache trên NGINX

I. Tổng quan

Nginx FastCGI Cache là gì?

  • Như đã biết, NGINX rất nhanh khi xử lý các trang HTLM tĩnh, nhưng lại chậm khi xử lý các mã PHP mặc dù có cải thiện trên các phiên bản PHP mới. Khi tìm thấy mã PHP trong trang yêu cầu, NGINX sẽ chuyển yêu cầu đến PHP-FPM để xử lý.
  • Để giải quyết việc này, thay vì chuyển yêu cầu trang động đến PHP-FPM và để nó tạo trang HTML trong mọi thời điểm, Nginx có thể lưu vào bộ nhớ cache trang HTML đã tạo để sử dụng về sau, qua đó tăng năng lực và tốc độ xử lý của hệ thống.
  • FastCGI là giao thức giữa Nginx và PHP-FPM hoạt động như cache được gọi là Nginx FastCGI cache.
II. Hướng dẫn cấu hình FastCGI Cache trên NGINX
  1. Bước 1: Kiểm tra và disable selinux
    • Mở file cấu hình selinux bằng lênh:
      # vi /etc/selinux/config
    • Trong nội dung thay đổi dòng
      SELINUX=enforcing
      thành
      SELINUX=disabled
    • Lưu lại file và restart server để áp dụng cấu hình.
  2. Bước 2: Cấu hình Nginx
    • Xác định file cấu hình chính của nginx, thông thường /etc/nginx/nginx.conf . Quý khách có thể kiểm tra chính xác vị trí file cấu hình bằng lệnh:
      # nginx -T | grep configuration
    • Thay đổi cấu hình file với lệnh:
      # vi /etc/nginx/nginx.conf
    • Trong phần cấu hình http, thêm vào các dòng sau:
      fastcgi_cache_path /usr/share/nginx/fastcgi_cache levels=1:2 keys_zone=phpcache:100m max_size=10g inactive=60m use_temp_path=off;
      fastcgi_cache_key "$scheme$request_method$host$request_uri";

      image-1639042059107.png

    • Trong đó:
        • fastcgi_cache_path: chỉ định vị trí lưu trữ cache trong hệ thống.
        • levels: sẽ xác định phân cấp của bộ nhớ cache trong thư mục lưu trữ (thông thường 1:2). Nếu không thiết lập, Nginx sẽ đẩy toàn bộ các file và cùng một thư mục.
        • keys_zone: thiết lập vùng nhớ chia sẽ (phpcache) và kích thước. Vùng nhớ sẽ lưu trữ các khóa cache và metadata như thời gian sử dụng. 1 MB zone có thể lưu trữ khoản 8000 key.
        • max_size đặt giới hạn trên của kích thước bộ nhớ đệm (trong ví dụ này là 10GB). Nếu không được chỉ định, bộ đệm có thể sử dụng tất cả dung lượng ổ đĩa còn lại. Khi bộ nhớ cache đạt đến kích thước tối đa, trình quản lý bộ nhớ cache Nginx sẽ xóa các tệp ít được sử dụng gần đây nhất khỏi bộ nhớ cache.
        • inactive=60m Dữ liệu chưa được truy cập trong khoảng thời gian không hoạt động (60 phút) sẽ bị trình quản lý bộ nhớ đệm xóa khỏi bộ nhớ cache, bất kể nó đã hết hạn hay chưa. Giá trị mặc định là 10 phút. Bạn cũng có thể sử dụng các giá trị như 12h(12 giờ) và 7d(7 ngày).
        • Trước tiên, Nginx ghi các tệp được định sẵn cho bộ nhớ cache vào vùng lưu trữ tạm ( /var/lib/nginx/fastcgi/). Tùy chọn use_temp_path=off yêu cầu Nginx ghi chúng trực tiếp vào thư mục cache cuối cùng để tránh việc copy dữ liệu không cần thiết.
  3. Bước 3: Cấu hình FastCGI Cache trên domain
    • Xác định file cấu hình domain cần cấu hình fastcgi cache. Thông thường, file cấu hình sẽ nằm trong thư mục /etc/nginx/conf.d/[domain_name].conf
    • Trong ví dụ này, Long Vân sử dụng domain my-domain.com. Dùng trình soạn thảo VIM để mở file cấu hình với lệnh:
      vi /etc/nginx/conf.d/my-domain.conf
    • Thêm các dòng sau vào bên trong block location ~ .php$như sau:
      fastcgi_cache phpcache;
      fastcgi_cache_valid 200 301 302 60m;
      fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
      fastcgi_cache_min_uses 1;
      fastcgi_cache_lock on;

      image-1639042818814.png

    • Trong đó:
      • fastcgi_cache: thiết lập vùng nhớ chia sẽ đã được tạo ra trước đó ở chỉ thị fastcgi_cache_path
      • fastcgi_cache_valid 200 301 302 60m: Thiết lập thời gian cache tuỳ thuộc vào mã trang thái HTTP. Trong bài viết này các phản hồi có mã trạng thái 200, 301, 302 thì sẽ lưu vào cache trong 60 phút (Bạn có thể tuỳ chọn theo ngày hoặc giờ ví dụ là 24h, 7d).
      • fastcgi_cache_min_uses 1: đặt số lần một trang (items) được người dùng cuối yêu cầu trước khi Nginx lưu vào bộ nhớ cache. Giá trị mặc định là 1.
      • fastcgi_cache_lock on: nếu nhiều máy khách yêu cầu một tệp không có trong bộ nhớ cache, thì chỉ yêu cầu đầu tiên trong số những yêu cầu đó được phép chuyển tới máy chủ PHP-FPM ngược dòng. Các yêu cầu còn lại đợi yêu cầu đó được đáp ứng và sau đó kéo tệp tạo thành bộ nhớ cache. Nếu không (off) tất cả các yêu cầu sẽ chuyển thẳng đến máy chủ PHP-FPM.
      • add_header X-FastCGI-Cache $upstream_cache_status: Dòng này được sử dụng để xác nhận xem các yêu cầu đã được phục vụ từ bộ nhớ cache FastCGI hay chưa.
  4. Bước 4: Reload lại cấu hình NGINX
    • Kiểm tra lại cấu hình Nginx bằng lệnh
      sudo nginx –t
    • Đảm bảo kết quả cấu hình thành công (successful). Sau đó, thực hiện reload cấu hình nginx bằng lệnh:
      sudo systemctl reload nginx

      hoặc

      sudo service nginx reload
  5. Bước 5: Kiểm tra NGINX FastCGI Cache
    • Truy cập website bằng lệnh (có thể trên linux hoặc command promt trên windows):
      # curl -I http://my-domain.com

      image-1639043093815.png

    • Reload lại website để Nginx thực hiện việc cache.
    • Theo dõi header X-FastCGI-Cache, kết quả nhận được là HIT cho biết website đã được phản hồi từ bộ nhớ cache
      image-1639043116741.png
  6. Bước 6: Bổ sung cấu hình nội dung không lưu cache.
    • Trong file cấu hình domain, thiết lập 2 directive sau trong location ~ .php$
      fastcgi_cache_bypass $skip_cache;

      > chuyển trực tiếp yêu cầu vào PHP-FPM thay vì tìm trong bộ nhớ cache.

      fastcgi_no_cache $skip_cache;

      > yêu cầu NGNIX không lưu phản hồi vào bộ nhớ cache.

    • Các phiên đăng nhập, cookie, POST request, chuỗi truy vấn, WordPress back-end, sơ đồ trang web (sitemap), feeds và command author (wordpress) không nên lưu vào bộ nhớ đệm. Trong file cấu hình của domain, thêm các dòng bên dưới ở location ~ .php$set $skip_cache 0;
      # các POST request hoặc các url với chuỗi truy vấn luôn chuyển trực tiếp đến PHP
      if ($request_method = POST) {
              set $skip_cache 1;
      }
      if ($query_string != "") {
               set $skip_cache 1;
      }
      # không cache wordpress back-end, sitemap
      if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*.(xml|xsl)") {
              set $skip_cache 1;
      }# không cache logged in users hoặc recent commenters trong wordpress
      if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
              set $skip_cache 1;
      }

      image-1639045076982.png

    • Ngoài ra, để bỏ qua việc cache đối với một IP hoặc một range IP nhằm mục đích riêng như kiểm tra tốc độ với một website cụ thể có thể thêm cấu hình như sau vào location ~ .php$

      if ($remote_addr ~* "103.34.56.78|103.34.56.79|104.34.55..*) {
              set $skip_cache 1; 
      }
    • Theo đó, biểu tượng dấu ngã ( ~) cho Nginx biết rằng những gì sau đây là một biểu thức chính quy (regex). Biểu tượng ngôi sao (*) giúp phân biệt chữ hoa chữ thường regex. Thanh dọc (|) là để thay thế một số giá trị. Nếu giá trị của biến $ remote_addr khớp với bất kỳ địa chỉ IP nào trong regex, thì hãy đặt giá trị của $ ignore_cache thành 1.
    • Cuối cùng, reload lại cấu hình Nginx và kiểm tra Nginx FastCGI Cache như ở bước 4,5

Như vậy, Long Vân đã hoàn thành hướng dẫn các bạn cấu hình Nginx FastCGI Cache trên NGINX. Chúc các bạn thành công .