В статье Настройка веб-сервера 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 не через порт, а через файл.