Настройка Nginx для использования с модулями Drupal ImageCache и Boost

В статье Настройка веб-сервера Nginx на Debian Squeeze как front-end к Apache мы рассмотрели настройку Nginx. Сегодня будет небольшое продолжение этой статьи и мы рассмотрим какие правила нужно прописать в конфигурации Nginx, чтобы наладить корректную работу с модулями ImageCache и Boost.

Немного теории об ImageCache

ImageCache автоматически обрабатывает изображения на основе пресетов (сценариев обработки). Алгоритм работы веб-сервера с ImageCache:

  1. При попытке загрузить изображение ImageCache проверяется наличие этого изображения на диске на диске.
  2. Если изображение существует, то загружаем его.
  3. Если изображения нет, то передаем управление Drupal для создания этого изображения.

Немного теории про Boost

Boost создает HTML копии страницы, применяется в кэшировании для анонимных пользователей, подробно функционал boost описан в статье Кэширование в Drupal Алгоритм работы веб-сервера с boost:

  1. При запросе пользователя к какой-нибудь странице сайта проверяется наличие HTML копии странице на диске.
  2. Если HTML копия имеется, то загружаем ее.
  3. Если HTML копии нет, то передаем управление Drupal для генерации HTML копии этой страницы.

Конфигурация Nginx

Предположим, что изображения ImageCache лежат в

/home/webmaster/domains/drupal-admin.ru/html/sites/default/files/imagecache/

Начиная с Drupal 7 эти файлы обычно лежат в папке sites/default/files/styles

Кэшированные boost'ом страницы лежат в

/home/webmaster/domains/drupal-admin.ru/html/cache/

Таким образом конфигурация nginx для сайта drupal-admin.ru изменится и станет такой:

server {
  listen 80; 
  server_name drupal-admin.ru www.drupal-admin.ru;
  root /home/webmaster/domains/drupal-admin.ru/html;
  index index.html index.htm;

  access_log /home/webmaster/domains/drupal-admin.ru/logs/nginx_access.log;

  error_log /home/webmaster/domains/drupal-admin.ru/logs/nginx_error.log;

   
  # для Drupal 6
  location ~ ^/sites/default/files/imagecache/ {
     index index.php;
     try_files $uri /index.php?q=$uri;    
   }

  # для Drupal 7 и т.д.
  location ~ ^/files/default/styles/ {
     try_files $uri @drupal;
  }

  location ~* \.php$ {
      proxy_pass http://127.0.0.1:8080;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location / {
       # Пробуем загрузить файл, если не получается то смотрим в кэше Boost, иначе переходим на Apache
       try_files $uri @cache;
  }

   #Правила для кэша boost
   location @cache {
    # все запросы кроме Get запросы для которых установлен cookies передаем на Drupal.
     if ($http_cookie ~ "DRUPAL_UID" ) {
       return 405;
     }
     if ($request_method !~ ^(GET|HEAD)$ ) {
       return 405;
     }
     error_page 405 = @drupal;
     gzip on;
     add_header Expires "Tue, 22 Sep 1974 08:00:00 GMT";
     add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
     try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @drupal;
  }

 location @drupal {
     proxy_pass         http://127.0.0.1:8080;
     proxy_redirect     default;
     proxy_set_header   Host             $host;
     proxy_set_header   X-Real-IP        $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     client_max_body_size       10m;
     client_body_buffer_size    128k;
     proxy_send_timeout         90;
     proxy_read_timeout         90;
     proxy_buffer_size   4k;
     proxy_buffers              16 32k;
     proxy_busy_buffers_size    64k;
     proxy_temp_file_write_size 64k;
   }
}

Вот теперь у нас конфигурация nginx учитывающая наличие на нашем сайте модулей Boost и ImageCache.

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

При настройке Nginx важно учитывать вопросы безопасности. В исходной конфигурации существовал риск прямого доступа к PHP-файлам, таким как sites/default/settings.php, что потенциально могло привести к компрометации сайта. Для устранения этой проблемы было добавлено правило обработки запросов к файлам с расширением .php, перенаправляющее их на backend-сервер.

В конфигурацию был добавлен следующий блок обработки PHP-запросов через проксирование, а также правило для корректной работы imagecache. Однако в процессе обсуждения выяснилось, что данный блок может быть избыточным, поскольку основная логика обработки запросов уже реализована через директиву try_files, которая сначала проверяет наличие файла, затем кэш Boost и только после этого передаёт запрос на backend.

После дополнительного анализа стало очевидно, что существующее правило является более лаконичным и логически завершённым решением, а добавленные директивы могут не требоваться. Конфигурация будет уточнена и скорректирована по результатам тестирования.

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

Добавить комментарий

Filtered HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <pre> <br> <h1> <h2 id> <h3 id>
  • Строки и абзацы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.