2015-09-09 15 views
7

Tôi chạy một máy chủ nginx + API webservices của PHP. Tôi sử dụng fastcgi_cache của nginx để lưu trữ tất cả các yêu cầu GET và khi một số tài nguyên được cập nhật, tôi lọc một hoặc nhiều tài nguyên được lưu trữ có liên quan.Làm sạch các tệp bộ nhớ cache nginx không phải lúc nào cũng hoạt động

Phương pháp tôi đang sử dụng để thực hiện việc này là tính toán tên tệp bộ nhớ cache nginx cho từng tài nguyên tôi muốn xóa, sau đó xóa tệp đó. Đối với hầu hết các phần, điều này hoạt động tốt.

Tuy nhiên, tôi thấy rằng đôi khi, ngay cả sau khi tệp bộ nhớ cache bị xóa, nginx vẫn sẽ trả về dữ liệu từ bộ nhớ cache.

Đây không phải là một vấn đề với việc lựa chọn các tập tin bộ nhớ cache đúng để xóa - như một phần của thử nghiệm của tôi, tôi đã xóa thư mục bộ nhớ cache toàn bộ, và nginx vẫn trả về phản hồi HIT

Có ai biết tại sao điều này có thể xảy ra? Có thể một bộ nhớ cache khác có liên quan không? Ví dụ: có thể hệ điều hành đang trả về phiên bản cache của tệp bộ nhớ cache cho nginx, vì vậy nginx không biết rằng nó đã bị xóa?

Tôi đang chạy này trên CentOS, và với cấu hình này nginx (trừ phần không liên quan):

user nginx; 

# Let nginx figure out the best value 
worker_processes auto; 

events { 
    worker_connections 10240; 
    multi_accept  on; 
    use     epoll; 
} 

# Maximum number of open files should be at least worker_connections * 2 
worker_rlimit_nofile 40960; 

# Enable regex JIT compiler 
pcre_jit on; 

http { 

    # TCP optimisation 
    sendfile  on; 
    tcp_nodelay  on; 
    tcp_nopush  on; 

    # Configure keep alive 
    keepalive_requests 1000; 
    keepalive_timeout 120s 120s; 

    # Configure SPDY 
    spdy_headers_comp 2; 

    # Configure global PHP cache 
    fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=xxx:100m inactive=24h; 

    # Enable open file caching 
    open_file_cache max=10000 inactive=120s; 
    open_file_cache_valid 120s; 
    open_file_cache_min_uses 5; 
    open_file_cache_errors off; 

    server { 
     server_name xxx; 
     listen 8080; 

     # Send all dynamic content requests to the main app handler 
     if (!-f $document_root$uri) { 

      rewrite ^/(.+) /index.php/$1   last; 
      rewrite ^/  /index.php   last; 
     } 

     # Proxy PHP requests to php-fpm 
     location ~ [^/]\.php(/|$) { 

      # Enable caching 
      fastcgi_cache xxx; 

      # Only cache GET and HEAD responses 
      fastcgi_cache_methods GET HEAD; 

      # Caching is off by default, an can only be enabled using Cache-Control response headers 
      fastcgi_cache_valid 0; 

      # Allow only one identical request to be forwarded (others will get a stale response) 
      fastcgi_cache_lock on; 

      # Define conditions for which stale content will be returned 
      fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; 

      # Define cache key to uniquely identify cached objects 
      fastcgi_cache_key "$scheme$request_method$host$request_uri"; 

      # Add a header to response to indicate cache results 
      add_header X-Cache $upstream_cache_status; 

      # Configure standard server parameters 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      include fastcgi_params; 

      # php-fpm config 
      fastcgi_param SCRIPT_URL  $fastcgi_path_info; 
      fastcgi_param PATH_INFO   $fastcgi_path_info; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_param REQUEST_SCHEME $scheme; 
      fastcgi_param REMOTE_USER  $remote_user; 

      # Read buffer sizes 
      fastcgi_buffer_size 128k; 
      fastcgi_buffers 256 16k; 
      fastcgi_busy_buffers_size 256k; 
      fastcgi_temp_file_write_size 256k; 

      # Keep connection open to enable keep-alive 
      fastcgi_keep_conn on; 

      # Proxy to PHP 
      fastcgi_pass unix:/var/run/php-fpm/fpm.sock; 
     } 
    } 
} 

Bây giờ tôi xem xét điều này, có thể các thông số open_file_cache thể ảnh hưởng đến các tập tin bộ nhớ cache?

Bất kỳ ý tưởng nào?

+0

hãy nghĩ về điều này, đây thực sự là một câu hỏi khá hay.:-) – cnst

Trả lời

6

Không, hệ điều hành không lưu trữ tệp.

Tuy nhiên, lý do điều này có thể xảy ra là các tệp không thực sự bị xóa hoàn toàn cho đến khi cả số liên kết và số lượng các quá trình có tệp mở đều xuống 0.

Các unlink(2) manual page, với thông tin về các system call được sử dụng bởi các công cụ như rm, đọc như sau:

Các bỏ liên kết() chức năng loại bỏ các liên kết có tên bởi đường đi từ thư mục của nó và decrements đếm liên kết của tệp được tham chiếu bởi liên kết. Nếu giảm đó làm giảm số lượng liên kết của tập tin về số không, và không có quá trình có tập tin mở, sau đó tất cả các nguồn lực liên kết với các tập tin được khai hoang. Nếu một hoặc nhiều tiến trình có tệp mở khi liên kết cuối cùng bị xóa, liên kết sẽ bị xóa, nhưng việc xóa tệp bị trì hoãn cho đến khi tất cả các tham chiếu đến tệp đó đã bị đóng.

Tùy thuộc vào hệ thống, bạn thực sự vẫn có thể khôi phục các tệp mở như vậy mà không bị mất dữ liệu, ví dụ: xem https://unix.stackexchange.com/questions/61820/how-can-i-access-a-deleted-open-file-on-linux-output-of-a-running-crontab-task.

Vì vậy, thực sự, open_file_cache sẽ loại trừ hiệu quả việc xóa của bạn khỏi bất kỳ tác động nào trong các quy trình vẫn có các bộ mô tả tệp có liên quan trong bộ nhớ cache của chúng. Bạn có thể muốn sử dụng ngắn hơn open_file_cache_valid nếu khẩn cấp tẩy sau khi xóa là rất quan trọng với bạn.

0

Đảm bảo trình duyệt của bạn không lưu trong bộ nhớ cache các trang. Hãy thử chọn tùy chọn tắt bộ nhớ cache trong bảng điều khiển trình duyệt và giữ bàn điều khiển mở trong khi kiểm tra máy chủ của bạn để lưu vào bộ nhớ cache.

enter image description here

Các vấn đề liên quan