Xóa bộ nhớ đệm NGINX sẽ đưa ra lỗi Unlink quan trọng trong Nhật ký lỗi
Đã xuất bản: lúc 11:25:13 UTC 15 tháng 2, 2025
Bài viết này giải thích cách xóa các mục khỏi bộ nhớ đệm của NGINX mà không làm cho tệp nhật ký của bạn lộn xộn với các thông báo lỗi. Mặc dù không phải là cách tiếp cận được khuyến nghị, nhưng nó có thể hữu ích trong một số trường hợp ngoại lệ.
Deleting NGINX Cache Puts Critical Unlink Errors in Error Log
Thông tin trong bài đăng này dựa trên bộ nhớ đệm FastCGI trên NGINX 1.4.6 chạy trên Ubuntu Server 14.04 x64. Nó có thể hoặc không thể hợp lệ đối với các phiên bản khác.
(Cập nhật 2025: Trong khoảng thời gian từ khi tôi viết bài đăng gốc cho đến nay, rất nhiều thứ đã thay đổi. Máy chủ nhanh hơn và rẻ hơn, vì vậy trên thực tế, tôi không khuyến nghị cách tiếp cận được mô tả trong bài đăng này, trong đó tôi cố gắng quản lý vi mô thời gian hết hạn bộ đệm chỉ để lưu thêm một vài thế hệ nội dung động. Tôi sẽ để lại nội dung ở đây để tham khảo trong tương lai và trong trường hợp ai đó thực sự cần nó vì bất kỳ lý do gì. Tuy nhiên, tôi chưa xác nhận rằng cách này vẫn hoạt động với các phiên bản NGINX hiện tại, nhưng tôi nghĩ là có).
Sau khi di chuyển một số trang web từ Apache sang NGINX, tôi rất thích khả năng lưu trữ đệm tích hợp của nó, hoạt động cực kỳ tốt trong hầu hết các trường hợp mà không cần tôi can thiệp nhiều.
Tuy nhiên, đối với một trong các trang web, tôi thực sự cần khả năng tự xóa bộ nhớ đệm (cả xóa hoàn toàn và xóa từng mục riêng lẻ). Phiên bản cộng đồng miễn phí của NGINX chỉ hỗ trợ hết hạn bộ nhớ đệm theo thời gian (tức là bạn có thể thiết lập để kiểm tra xem có thay đổi gì sau một giờ, một ngày, v.v.) không. Nhưng nếu không có cách đáng tin cậy nào để xác định trước thời điểm một tài nguyên nhất định sẽ thay đổi thì sao? Ví dụ, tôi không biết phải mất một giờ, một ngày hay một năm trước khi tôi quay lại và chỉnh sửa một nội dung nào đó trong bài đăng này - và tại sao chỉ lưu vào bộ nhớ đệm trong một giờ nếu lưu vào bộ nhớ đệm trong một ngày thì ổn?
Đây là nơi cần có khả năng xóa bộ nhớ đệm thủ công (hoặc bằng cách để ứng dụng web của bạn thông báo cho NGINX rằng có thứ gì đó cần được xóa). Những người đứng sau NGINX rõ ràng nhận thức được nhu cầu này vì tính năng này được hỗ trợ trong phiên bản trả phí của sản phẩm của họ – nhưng mặc dù họ chắc chắn có quyền thiết lập giấy phép theo bất kỳ cách nào họ muốn, nhưng giá hơi cao đối với tôi khi chức năng này là tính năng trả phí duy nhất mà tôi thực sự cần.
May mắn thay, hóa ra bạn có thể tự xóa các tệp khỏi thư mục bộ nhớ đệm và NGINX sẽ nhận ra điều này và lấy một bản sao mới từ back-end của bạn mà không gặp trở ngại nào. Tuy nhiên, nếu bạn thực hiện việc này mà không điều chỉnh cấu hình của mình, bạn có thể thấy một loạt các thông báo tương tự như thông báo này trong nhật ký lỗi của mình sau một thời gian:
Có vẻ như những lỗi này xảy ra khi NGINX tự cố gắng xóa các mục bộ nhớ đệm sau thời gian được chỉ định bởi tham số inactive của chỉ thị fastcgi_cache_path . Mặc định cho việc này chỉ là 10 phút, nhưng bạn có thể đặt thành bất kỳ giá trị nào bạn muốn. Nếu bạn đặt thành, chẳng hạn, 10 năm, thì có lẽ không có khả năng là bạn chưa khởi động lại máy chủ trong thời gian đó nên chỉ mục khóa trong bộ nhớ sẽ bị xóa trong thời gian đó. Nếu bạn thực hiện việc này, bạn cần đảm bảo rằng mình tự xóa bộ nhớ đệm, NGINX sẽ không còn thực hiện việc đó thay bạn nữa.
Tôi thấy thật lạ khi một mục trong bộ nhớ đệm không thể xóa được vì nó không tồn tại lại được coi là lỗi nghiêm trọng . Thực tế là mức độ nghiêm trọng của nó quá cao có nghĩa là không thể loại bỏ chỉ bằng cách bỏ qua các mục nhật ký dưới một ngưỡng nhất định. Ngay khi một bản sao mới được lấy từ phần phụ trợ, mục đó sẽ lại tồn tại, vì vậy theo tôi, đây chỉ nên là một cảnh báo.
Bây giờ, nếu mục nhập bộ đệm không thể bị xóa do vấn đề về quyền hoặc lý do thứ ba, thì đó sẽ là lỗi nghiêm trọng, vì nó có thể khiến NGINX tiếp tục phục vụ nội dung được lưu trong bộ đệm trong thời gian dài sau khi hết hạn, nhưng quá trình dọn dẹp dường như không tạo ra sự khác biệt này.