Cách cấu hình Nginx FastCGI Cache tăng tốc website PHP
Hướng dẫn thiết lập Nginx FastCGI Cache để giảm số lần PHP phải xử lý yêu cầu, kèm cách loại trừ trang đăng nhập, giỏ hàng và nội dung riêng tư khỏi bộ nhớ đệm.
Website PHP có thể mất thời gian xử lý mỗi yêu cầu nếu máy chủ phải khởi chạy PHP-FPM và truy vấn cơ sở dữ liệu lặp đi lặp lại, kể cả với những trang ít thay đổi. Nginx FastCGI Cache giúp lưu tạm phản hồi từ PHP-FPM để phục vụ lại cho các yêu cầu tiếp theo, giảm công việc xử lý phía máy chủ. Bài viết dưới đây hướng dẫn cách cấu hình FastCGI Cache và những lưu ý quan trọng để không lưu nhầm nội dung riêng tư hoặc thay đổi thường xuyên.
Hướng dẫn cài GitLab trên VPS từ khâu chuẩn bị máy chủ, trỏ tên miền đến thiết lập bảo mật và sao lưu. Phù hợp với cá nhân, nhóm phát triển muốn tự quản lý kho mã nguồn.
#GitLab
#GitLab self-hosted
#VPS
VVibeVPS
Sẵn sàng triển khai?
Đưa website của bạn lên Cloud VPS ngay hôm nay
Khởi tạo tự động ngay sau khi thanh toán, chuyển khoản bằng mã QR, bật tắt và cài lại máy chủ trong trang quản lý.
Sơ đồ Nginx lưu phản hồi PHP để phục vụ lại yêu cầu website
Khi chưa bật cache, một yêu cầu đến trang PHP thường được Nginx chuyển tiếp đến PHP-FPM. Ứng dụng PHP chạy mã nguồn, có thể truy vấn cơ sở dữ liệu, rồi trả phản hồi về cho Nginx để gửi tới người truy cập. Với FastCGI Cache, Nginx có thể lưu phản hồi đó trên máy chủ trong khoảng thời gian được cấu hình. Nếu có yêu cầu phù hợp tiếp theo, Nginx trả nội dung đã lưu thay vì chuyển yêu cầu qua toàn bộ quy trình PHP.
Cơ chế này hữu ích với các trang công khai có nội dung tương đối ổn định như bài viết, trang giới thiệu hoặc danh mục sản phẩm. Tuy nhiên, bộ nhớ đệm không phù hợp với mọi nội dung. Trang tài khoản, giỏ hàng, thanh toán hay trang quản trị có thể hiển thị dữ liệu riêng của từng người dùng. Nếu lưu hoặc phát lại phản hồi không đúng cách, người dùng có thể nhìn thấy nội dung không dành cho mình.
FastCGI Cache lưu phản hồi do ứng dụng trả về, không thay thế bộ nhớ đệm của trình duyệt hay việc tối ưu mã PHP và cơ sở dữ liệu. Cần kiểm tra thiết kế ứng dụng, chính sách cookie và các tiêu đề HTTP trước khi áp dụng trên website đang hoạt động.
Chuẩn bị và cấu hình cơ bản
Quản trị viên thiết lập vùng FastCGI Cache trên máy chủ Nginx
Trước tiên, hãy xác nhận Nginx đang chuyển yêu cầu PHP tới PHP-FPM và bạn có quyền chỉnh sửa cấu hình. Các đường dẫn tệp, tên socket PHP-FPM và người dùng chạy Nginx khác nhau tùy hệ điều hành, phiên bản PHP và cách cài đặt. Nên sao lưu tệp cấu hình trước khi thay đổi.
Khai báo vùng cache trong khối http của cấu hình Nginx, thường nằm trong /etc/nginx/nginx.conf. Nếu tệp cấu hình máy chủ được nạp từ sites-enabled, phần map dưới đây cũng cần được đặt trong khối http, không đặt bên trong server hoặc location:
http {
fastcgi_cache_path /var/cache/nginx/fastcgi
levels=1:2
keys_zone=PHPZONE:100m
inactive=60m
max_size=1g;
map $request_method $skip_cache_method {
default 1;
GET 0;
HEAD 0;
}
map $http_cookie $skip_cache_cookie {
default 0;
~*(wordpress_logged_in|wordpress_sec|wp-postpass|comment_author|woocommerce_items_in_cart|woocommerce_cart_hash|wp_woocommerce_session_) 1;
}
map $request_uri $skip_cache_uri {
default 0;
~*^/(wp-admin|wp-login\.php|cart|checkout|my-account)(/|$) 1;
}
map $http_authorization $skip_cache_auth {
default 0;
~.+ 1;
}
# Các cấu hình khác của Nginx...
}
keys_zone=PHPZONE:100m tạo vùng lưu khóa cache trong bộ nhớ dùng chung; đây không phải dung lượng lưu toàn bộ nội dung phản hồi. max_size giới hạn dung lượng dữ liệu trên đĩa, còn inactive quy định khoảng thời gian một mục không được truy cập trước khi Nginx có thể loại bỏ mục đó. Hãy điều chỉnh đường dẫn và giới hạn cho phù hợp với máy chủ. Tài khoản worker của Nginx cần có quyền ghi vào thư mục cache.
Các quy tắc map tạo biến quyết định khi nào bỏ qua cache. Ví dụ trên chỉ cho phép phương thức GET và HEAD, đồng thời nhận diện một số cookie, đường dẫn thường gặp trong WordPress và yêu cầu có thông tin xác thực. Danh sách này chỉ là khung tham khảo: hãy bổ sung hoặc điều chỉnh theo ứng dụng thực tế, đặc biệt nếu website có trang cá nhân hóa hay hệ thống đăng nhập riêng.
Tiếp theo, thêm các chỉ thị vào location xử lý PHP bên trong khối server. Ví dụ dưới đây minh họa cấu hình, không thay thế các tham số FastCGI mà website của bạn đang cần:
Thay socket PHP-FPM bằng giá trị đúng với máy chủ của bạn. fastcgi_cache_key xác định yêu cầu nào được xem là cùng một mục cache; cấu hình trên phân biệt giao thức, phương thức, tên miền và URI, bao gồm chuỗi truy vấn. Không nên bỏ tham số truy vấn khỏi khóa một cách tùy tiện, vì một số ứng dụng dùng chúng để tạo nội dung khác nhau.
fastcgi_cache_valid đặt thời gian lưu theo mã phản hồi. Các giá trị trong ví dụ chỉ có tính minh họa, không phải mức phù hợp cho mọi website. fastcgi_cache_bypass không dùng nội dung đã lưu cho yêu cầu cần bỏ qua; fastcgi_no_cache ngăn phản hồi mới được ghi vào cache. Việc kiểm tra cả hai giúp tránh sử dụng hoặc lưu phản hồi trong những trường hợp đã xác định là động. Quy tắc $upstream_http_set_cookie cũng ngăn lưu phản hồi có tiêu đề Set-Cookie.
Loại trừ nội dung riêng tư và thay đổi thường xuyên
Bước quan trọng nhất khi triển khai cache website PHP là xác định phần nào được phép lưu. Bắt đầu bằng việc lập danh sách các trang có thông tin theo người dùng, chẳng hạn trang tài khoản, lịch sử đơn hàng, giỏ hàng, thanh toán, trang quản trị và biểu mẫu có dữ liệu riêng tư. Thêm đường dẫn tương ứng vào biến bỏ qua cache, điều chỉnh biểu thức cho khớp chính xác cấu trúc URL của website.
Cookie cũng cần được xem xét kỹ. Người dùng đã đăng nhập thường mang cookie nhận diện phiên; bỏ qua cache với các cookie phiên phù hợp giúp tránh dùng chung phản hồi giữa người dùng. Tuy nhiên, tên cookie trong ví dụ chỉ hướng tới một số tình huống WordPress. Với nền tảng khác, hãy tìm tên cookie đăng nhập, phiên làm việc hoặc trạng thái giỏ hàng trong ứng dụng và bổ sung chúng. Không nên loại trừ mọi cookie một cách máy móc nếu website vẫn có thể cache an toàn cho một số cookie không ảnh hưởng nội dung.
Cần lưu ý rằng chỉ kiểm tra cookie hoặc đường dẫn có thể chưa đủ. Ứng dụng có thể trả nội dung khác nhau dựa trên tiêu đề xác thực, tham số truy vấn, vị trí hoặc trạng thái phiên. Hãy rà soát cách PHP tạo phản hồi và các tiêu đề như Cache-Control, Expires và Set-Cookie. Nginx có những quy tắc xử lý tiêu đề từ máy chủ FastCGI; tránh vô hiệu hóa chúng khi chưa hiểu ảnh hưởng.
Nếu nội dung thay đổi thường xuyên, cân nhắc thời gian cache ngắn hơn hoặc không cache trang đó. Khi biên tập viên cập nhật bài viết, sản phẩm hay giá hiển thị, phản hồi cũ có thể còn được phục vụ cho đến khi hết hạn. Cách xử lý phù hợp tùy quy trình cập nhật của ứng dụng; đừng mặc định rằng nội dung thay đổi sẽ tự động bị xóa khỏi cache ngay lập tức.
Kiểm tra cấu hình và vận hành
Minh họa phân biệt trang công khai được cache và trang riêng tư cần bỏ qua
Sau khi chỉnh sửa, kiểm tra cú pháp trước khi nạp lại Nginx:
sudo nginx -t
sudo systemctl reload nginx
Chỉ nạp lại khi kiểm tra cấu hình thành công. Nếu Nginx báo lỗi, xem dòng được chỉ ra để xác định sai vị trí khối map, thiếu dấu chấm phẩy, đường dẫn sai hoặc tham số không được hỗ trợ.
Để kiểm tra kết quả, gửi hai yêu cầu GET giống nhau tới một trang công khai. Có thể dùng lệnh sau và chạy lại lần nữa:
Xem tiêu đề X-FastCGI-Cache được thêm trong ví dụ. Lần đầu có thể trả về MISS, còn yêu cầu sau có thể là HIT nếu phản hồi đủ điều kiện và còn hạn. BYPASS cho biết yêu cầu đã bỏ qua cache; EXPIRED thường cho biết mục lưu đã hết hạn. Kết quả thực tế còn phụ thuộc phản hồi PHP, cookie, tiêu đề và cấu hình máy chủ. Nên kiểm tra cả trang công khai lẫn những đường dẫn phải loại trừ, đồng thời thử ở trạng thái đã đăng nhập và chưa đăng nhập.
Một số tình huống thường gặp:
Luôn thấy MISS: kiểm tra thời hạn cache, mã phản hồi, tiêu đề từ ứng dụng, quyền ghi thư mục và các quy tắc bỏ qua.
Trang riêng tư vẫn có dấu hiệu cache: tạm ngừng cache để điều tra, rà soát cookie, URL và tiêu đề xác thực; không tiếp tục phục vụ nội dung nếu chưa xác minh an toàn.
Nội dung cũ sau khi cập nhật: xem lại thời gian lưu và quy trình làm mới hoặc xóa cache của ứng dụng. Nếu không có cơ chế làm mới phù hợp, giảm thời gian lưu hoặc không cache trang đó.
Máy chủ báo không ghi được cache: xác định người dùng worker Nginx và cấp quyền đúng cho thư mục, tránh mở quyền ghi rộng hơn mức cần thiết.
Theo dõi log Nginx, tải máy chủ và phản hồi thực tế sau khi triển khai. Bật cache không thay thế việc cập nhật PHP, Nginx và ứng dụng, cũng không bảo đảm mọi trang đều tải nhanh hơn. Hãy thay đổi từng phần, kiểm tra trên môi trường thử nghiệm nếu có và giữ lại cấu hình cũ để có thể khôi phục khi phát sinh lỗi.
Tổng kết
Nginx FastCGI Cache có thể giảm số lần PHP-FPM phải xử lý các yêu cầu lặp lại, nhưng hiệu quả phụ thuộc vào cách chọn khóa cache, thời hạn lưu và chính sách loại trừ. Hãy ưu tiên cache các trang công khai, chủ động bỏ qua trang đăng nhập, giỏ hàng, thanh toán và nội dung phụ thuộc người dùng. Sau đó kiểm tra bằng tiêu đề trạng thái cache và thử các tình huống thực tế trước khi áp dụng rộng rãi.
Nếu website cần môi trường có quyền quản trị để cấu hình Nginx và PHP-FPM, bạn có thể tham khảo các gói VPS AMD EPYC Gen 3 hoặc VPS Platinum Gen 2 của VibeVPS, từ 81.000đ/tháng. Hãy chọn tài nguyên phù hợp với ứng dụng và nhu cầu vận hành của mình.