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