В статье Настройка веб-сервера Nginx на Debian Squeeze как front-end к Apache мы рассмотрели настройку Nginx. Сегодня будет небольшое продолжение этой статьи и мы рассмотрим какие правила нужно прописать в конфигурации Nginx, чтобы наладить корректную работу с модулями ImageCache и Boost.
Немного теории об ImageCache
ImageCache автоматически обрабатывает изображения на основе пресетов (сценариев обработки). Алгоритм работы веб-сервера с ImageCache:
- При попытке загрузить изображение ImageCache проверяется наличие этого изображения на диске на диске.
- Если изображение существует, то загружаем его.
- Если изображения нет, то передаем управление Drupal для создания этого изображения.
Немного теории про Boost
Boost создает HTML копии страницы, применяется в кэшировании для анонимных пользователей, подробно функционал boost описан в статье Ускорение Drupal. Кэширование спасет ваш сайт. Алгоритм работы веб-сервера с boost:
- При запросе пользователя к какой-нибудь странице сайта проверяется наличие HTML копии странице на диске.
- Если HTML копия имеется, то загружаем ее.
- Если 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'а: Можно ли в нем отключить кэширование определенных страниц, к примеру главной?
P.S: функцию "Уведомлять меня о новых комментариях" бы :)
Да, boost позволяет отключить кэширование определенных страниц.
Функционал постараюсь сделать;)
В данной конфигурации при прямом запросе к *.php файлам они отдадутся nginx'ом напрямую. Запрос к files/default/settings.php и сайт взломан...
Спасибо, что обратили внимание. Добавил правило обработки для *.php, если будут еще замечания по этой конфигурации nginx напишите, пожалуйста.
А что именно вы добавили? Напишите отдельно пожалуйста
Добавил этот блок:
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 ~ ^/sites/default/files/imagecache/ {
index index.php;
try_files $uri /index.php?q=$uri;
}
Лишнее. ИМХО.
т.к. уже есть правило
location / {
# Пробуем загрузить файл, если не получается то смотрим в кэше Boost, иначе переходим на Apache
try_files $uri @cache;
}
Да, логично, похоже что Вы правы. После проведения тестов поправлю.
Спасибо, за оптимизацию;)
Спасибо, очень хотел решить проблему, и наконец-то решил с вашей помощью. под ником я тоже написал свой вариант конфига, если хотите можете сравнить. у меня, например сделано обращение к fcgi не через порт, а через файл.