Назад | Перейти на главную страницу

Joomla, Nginx и FastCGI Cache

Я занимаюсь перемещением некоторых сайтов 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) Протестируйте свою установку.