Я занимаюсь перемещением некоторых сайтов Joomla, которые я размещаю, в стек LEMP из стека LAMP. Я следовал руководству по настройке и запуску FastCGI Cache, и с одним файлом time.php в корне документа я вижу, что кеширование работает.
Однако, когда я загружаю свой сайт Joomla с того же веб-сервера, кеш не срабатывает.
Если я использую CURL для анализа заголовков при посещении домашней страницы сайта Joomla, я могу увидеть следующее:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Cache: MISS
Последняя запись X-Cache - это настраиваемый заголовок, который я добавил как часть руководства, просто чтобы указать, используется ли кеш. Однако две другие записи должны быть сгенерированы Joomla в какой-то момент, и кажется, что это как-то связано с тем фактом, что кеш не используется. (Эти две строки отсутствуют, когда я CURL файла time.php, о котором я упоминал ранее, поскольку он не является частью сайта Joomla.)
Я знаю, что здесь, вероятно, происходит что-то специфичное для Joomla, и поэтому я буду спрашивать, как я могу изменить поведение Joomla на форумах Joomla.
Мой вопрос для SE немного отличается: отвечают ли записи Cache-Control и Pragma за то, что мой сайт не использует кеш FastCGI, и есть ли что-нибудь, что я могу добавить в файл конфигурации nginx, чтобы удалить эти записи?
Два вопроса, два ответа:
Отвечают ли записи Cache-Control и Pragma остановке моего сайта от использования кеша FastCGI?
Да, они.
Собственно это заголовок "Cache-Control". Заголовок «Pragma» никогда не проектировался как заголовок HTTP-ответа (должен быть только заголовком HTTP-запроса) в старые добрые времена HTTP 1.0.
Могу ли я что-нибудь добавить в файл конфигурации Nginx, чтобы удалить эти записи?
Да, можно - но, может, и не стоит.
Кэширование частного контента может привести к катастрофе, поскольку вы можете показать панель администратора CMS каждому неизвестному посетителю. Вы должны проверить, создает ли CMS для каждого посетителя новый сеанс или только для внутренних пользователей. Если CMS создает сеанс для каждого посетителя, я бы рекомендовал не кешировать. Если это не так, но CMS предоставляет этот «не кэшируемый» заголовок, вы можете перезаписать это поведение с помощью Nginx.
По моему скромному мнению, не стоит перезаписывать на веб-сервере то, что программисты сделали в коде CMS. Но мы не живем в идеальном мире. Слишком мало хороших программистов CMS, знающих, что они делают с заголовком Cache-Control.
Перезапись, которую я описываю здесь, игнорирует заголовок Cache-Control CMS, пока нет файла cookie сеанса. Так можно было бы кешировать публичные страницы. Но если клиент открывает страницу входа в систему бэкэнда, будет запущен сеанс и будет установлен файл cookie сеанса. На все последующие запросы этого клиента будет дан ответ без использования кэшированных данных из-за файла cookie сеанса.
Как перезаписать:
1) Вам необходимо указать имя файла cookie сеанса (например, PHPSESSID).
2) Адаптируйте конфигурацию Nginx. См. Мой пример ниже:
# deliver static files or handle URL by CMS
location / {
try_files $uri @php;
}
# execute directly addressed PHP files
location ~ \.php$ {
try_files /467e1r1afrptaubui2oum6r95ssy9zbe.htm @php;
}
# common php handler
location @php {
try_files $uri /index.php?url=$uri&$query_string;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# caching
fastcgi_cache phpfpm;
fastcgi_cache_key "$request_method $scheme://$host$request_uri";
fastcgi_cache_use_stale updating error timeout invalid_header http_500;
# overwrite: cache web pages and permanent redirects for one hour
fastcgi_cache_valid 200 301 3600s;
# pass header Set-Cookie and Cookie
fastcgi_pass_header Set-Cookie;
fastcgi_pass_header Cookie;
# ignore header Cache-Control, Expires and Vary
fastcgi_ignore_headers Cache-Control Expires Vary;
# hide headers Expires, Pragma, Vary
fastcgi_hide_header Expires;
fastcgi_hide_header Pragma;
fastcgi_hide_header Vary;
# do not cache if cookie PHPSESSID exists
fastcgi_no_cache $cookie_PHPSESSID;
fastcgi_cache_bypass $cookie_PHPSESSID;
}
3) Протестируйте свою установку.