Очистка файлов кеша nginx не всегда работает

Я запускаю API-интерфейс nginx + PHP webservices. Я использую nginx fastcgi_cache для кэширования всех запросов GET, и когда некоторые ресурсы обновляются, я очищаю один или несколько связанных кешированных ресурсов.

Метод, который я использую для этого, - это вычислить имя файла кеша nginx для каждого ресурса, который я хочу очистить, а затем удалить этот файл. По большей части это хорошо работает.

Однако, я обнаружил, что иногда даже после удаления файла кэша nginx все равно будет возвращать данные из кеша.

Это не проблема с выбором правильного файла кеша для удаления - как часть моего тестирования, я удалил весь каталог кеша, а nginx все еще возвращает ответы HIT

Кто-нибудь знает, почему это может произойти? Возможно ли, что задействован другой кэш? Например, может ли быть, что ОС возвращает кэшированную версию файла кэша в nginx, поэтому nginx не знает, что он был удален?

Я запускаю это на CentOS и с этой конфигурацией nginx (минус нерелевантные части):

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;
 }
 }
}

Теперь, когда я смотрю на это, могут ли параметры open_file_cache влиять на файлы кеша?

Любые идеи?

2 ответа

Нет, ОС не кэширует файлы.

Однако причиной этого может быть то, что файлы фактически не удаляются полностью до тех пор, пока количество ссылок и количество процессов, у которых файл открыт, не упадут до нуля.

unlink(2) справочная страница, которая документирует систему вызов, используемый такими инструментами, как rm, выглядит следующим образом:

Функция unlink() удаляет ссылку с именем по пути из ее каталога и уменьшает количество ссылок на файл, на который ссылается ссылка. Если этот декремент уменьшает количество ссылок на файл до нуля и процесс не открывается, все ресурсы, связанные с файлом, будут восстановлены. Если один или несколько процессов открывают файл при удалении последней ссылки, ссылка удаляется, но удаление файла задерживается до тех пор, пока все ссылки на него не будут закрыты.

В зависимости от системы вы можете полностью восстановить такие открытые файлы полностью без потери данных, например, см. https://unix.stackexchange.com/questions/61820/how-can-i-access-a-deleted-open-file-on-linux-output-of-a-running-crontab-task.

Таким образом, действительно open_file_cache эффективно предотвратит ваше удаление от каких-либо последствий в процессах, которые все еще имеют соответствующие файловые дескрипторы в своих кэш. Вы можете использовать более короткий open_file_cache_valid, если для вас очень важна срочная очистка после удаления.


Убедитесь, что ваш браузер не кэширует страницы. Попробуйте выбрать параметр "Отключить кеш" в консоли браузера и откройте консоль при тестировании сервера для кэширования.

licensed under cc by-sa 3.0 with attribution.