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

Опубликовано admin - пт, 04/06/2012 - 03:58

В статье Настройка веб-сервера 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 позволяет отключить кэширование определенных страниц.
Функционал постараюсь сделать;)

В данной конфигурации при прямом запросе к *.php файлам они отдадутся nginx'ом напрямую. Запрос к files/default/settings.php и сайт взломан...


location ~ ^/sites/default/files/imagecache/ {
index index.php;
try_files $uri /index.php?q=$uri;
}

Лишнее. ИМХО.
т.к. уже есть правило

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

Да, логично, похоже что Вы правы. После проведения тестов поправлю.
Спасибо, за оптимизацию;)

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

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

Filtered HTML

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