- Вопрос или проблема
- Ответ или решение
- 1. Анализ конфигурации сервера
- 1.1 Условия для пропуска кеша
- 2. Заголовки и количество суммарных попыток кеша
- 2.1 Директивы fastcgi_cache_bypass и fastcgi_no_cache
- 3. Надежность кеша
- 3.1 Проверьте настройки кеша
- 3.2 Директория для кеша
- 4. Логи сервера
- 5. Тестирование кеша
- Заключение
Вопрос или проблема
Я настроил кэш FastCGI для моего сервера, работающего на nginx и wordpress, используя этот гид. Похоже, кэш всегда пропускается. Конкретная конфигурация сервера приведена ниже. Что я упустил?
server {
server_name <siteurl>;
root /var/www/html/<siteteurl>;
client_max_body_size 256M;
index maintanence.html index.php index.html index.htm;
### Favicon
location = /favicon.ico {
log_not_found off;
access_log off;
}
### Robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
set $skip_cache 0;
# POST запросы и URL с параметрами запроса всегда должны идти к PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Не кэшировать uri, содержащие следующие сегменты
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml|/.*sitemap.*\.(xml|xsl)") {
set $skip_cache 1;
}
# Не использовать кэш для вошедших пользователей или недавних комментаторов
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
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;
fastcgi_hide_header Pragma;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
add_header X-FastCGI-Cache $upstream_cache_status;
add_header Cache-Status $skip_cache;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl; # управляется Certbot
ssl_certificate /etc/letsencrypt/live/<siteteurl>/fullchain.pem; # управляется Certbot
ssl_certificate_key /etc/letsencrypt/live/<siteteurl>/privkey.pem; # управляется Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot
}
server {
if ($host = <siteteurl>) {
return 301 https://$host$request_uri;
} # управляется Certbot
listen 80;
server_name <siteurl>;
return 404; # управляется Certbot
}
.
Ответ или решение
При настройке кеширования FastCGI на сервере с использованием Nginx и WordPress, если вы постоянно наблюдаете статус CACHE MISS, необходимо провести детальное разбирательство этой ситуации. Мы рассмотрим возможные причины и предложим решения на основе вашего текущего конфигурационного файла.
1. Анализ конфигурации сервера
Ваша конфигурация включает несколько ключевых условий, которые могут привести к тому, что кеш всегда будет реагировать статусом MISS.
1.1 Условия для пропуска кеша
Вы указали несколько условий, при которых кеширование отключается:
- POST-запросы и URL с query string: У вас установлено условие, что при POST-запросах и запросах с параметрами пропуск кеша происходит всегда.
- Пути, не подлежащие кешированию: Проверка на наличие различных компонентов в
request_uri
, таких как/wp-admin/
,/xmlrpc.php
, и других URL, связанных с управлением контентом или комментариями. - Куки для авторизованных пользователей: Если в куках содержатся определенные значения, пропуск кеша также срабатывает.
Эти условия вполне разумны, но в некоторых случаях могут быть излишне строгими. Например, если вы делаете GET-запросы с параметрами, они тоже будут пропускать кеш.
Рекомендация: Проверьте, действительно ли ваш сайт отправляет запросы с параметрами. Если это не критично, рассмотрите возможность пересмотра условий, связанных с query_string
.
2. Заголовки и количество суммарных попыток кеша
2.1 Директивы fastcgi_cache_bypass
и fastcgi_no_cache
В вашей конфигурации fastcgi_cache_bypass
и fastcgi_no_cache
установлены на $skip_cache
, что означает, что при выполнении перечисленных выше условий кеш всегда будет пропускаться. Убедитесь, что эти условия действительно необходимы.
Рекомендация: Возможно, вам стоит упростить логику условий или добавить более специфичные правила для кеширования.
3. Надежность кеша
Вы указали директивы для управления кешом, но важно также удостовериться в наличии и корректной работе самого кеша.
3.1 Проверьте настройки кеша
Убедитесь, что кеш действительно включен и функционирует. Для этого можно использовать команду:
sudo nginx -t
Эта команда проверит конфигурационные файлы на наличие ошибок.
3.2 Директория для кеша
Проверьте, задана ли директория для хранения кеша. Она должна быть доступна для записи процессу Nginx. Например:
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=phpcache:10m max_size=10g inactive=60m use_temp_path=off;
4. Логи сервера
Обязательно просмотрите логи Nginx. Логи доступа и ошибки могут дать очень полезную информацию о том, почему кеш не сохраняется. Вы можете использовать команды:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
5. Тестирование кеша
После внесения изменений в конфигурацию, убедитесь, что вы тестируете кеширование правильно. Применение инструмента для анализа заголовков HTTP, например, curl
, поможет вам увидеть статус кеша:
curl -I http://<siteurl>
Обратите внимание на заголовок X-FastCGI-Cache
, который должен отображать статус HIT, если кеширование работает корректно.
Заключение
Чтобы исправить проблему с постоянным статусом CACHE MISS, вам необходимо:
- Провести анализ и возможную оптимизацию условий кеширования.
- Убедиться, что кеш правильно настроен и доступен для записи.
- Проверить логи на наличие ошибок.
- Тестировать изменения и проверки статусов кеша.
Регулярно пересматривая и обновляя настройки вашего сервера, можно значительно повысить его производительность и эффективность использования кеша.