Настраиваем Nginx под Drupal

nginx logo

Drupal (http://drupal.org) – это популярная платформа с откры-тым исходным кодом для управления содержимым. Она установле-на на многих известных сайтах. Как и большинство веб-каркасов на основе РНР, Drupal обычно работает под Apache с модулем mod_php. Мы покажем, как настроить NGINX для запуска Drupal.


На сайте https://github.com/perusio/drupal-with-nginx имеется очень подробная инструкция по настройке Drupal для работы с NGINX. Она куда детальнее того, что мы можем позволить себе в этой книге, но некоторые вещи мы все же отметим и остановимся на различиях между Drupal 6 и Drupal 7:

## Определяем переменную $no_slash_uri variable для Drupal 6. 

map $uri $no_slash_uri {
~^/(?<no_slash>.*)$ $no_slash;
}

server {
server_name www.example.com;
root /home/customer/html;
index index.php;

# Нe закрывать соединения с FastCGI-сервером (используется в 
# сочетании с директивой "Keepalive" в секции upstream) 

fastcgi_keep_conn on;

# Местоположение по умолчанию. 

location / (

## (Drupal 6) Использовать index.html. если нет index.php.

location = / { 
error_page 404 =200 /index.html;
}

# Обслуживание обычных частных файлов (тех, что обрабатываются Drupal).

location ^~ /system/files/ {

include fastcgi_private_files.conf;
fastcgi_pass 127.0.0.1:9000;

# Добавить следующую строку, чтобы в журнал ошибок не попадало 
# сообщение об ошибке 404 при доступе к каталогу system/files. 
# Ошибка 404 в данном случае - ожидаемое поведение.

log_not_found off;
}

# Попытка прямого доступа к частным файлам возвращает ошибку 404.

location ^~ /sites/default/files/private/ {
internal;
}

##(Drupal6) Придоступе к изображению, сгенерированному imagecache, 
## пытаемся вернуть его, если оно имеется, иначе переправляем запрос 
## Drupal для генерации или (перегенерации).

location ~* /imagecache/ {
access_log off;
expires 30d;
try_files $uri /index.php?q=$no_slash_uri&$args;
}

# Обработка изображений в Drupal 7, когда imagecache - часть ядра

location ~* /files/styles/ {
access_log off;
expires 30d;
try_files $uri @drupal;
}

Следующие далее настройки модуля Advanced Aggregation (Используется на сайте-странице с ремонтов ноутбуков в марьино) отличаются только значением location. Вот как выглядит конфигурация этого модуля для CSS:

# Поддержка CSS модулем Advanced Aggregation.

location ^~ /sites/default/files/advagg_css/ {location~*/sites/default/files/advagg_css/css_[[:alnum:]]+\.css$ {

А так для JavaScript:

# Поддержка JS модулем Advanced Aggregation.
location ^~ /sites/default/files/advagg_js/ {
location ~* /sites/default/files/advagg_js/js_ [[:alnum:]]+\.js$ {

Далее приведены строки, общие для обеих секций:

access_log off;
add_header Pragma '';
add_header Cache-Control 'public, max-age=946080000';
add_header Accept-Ranges '';

# Это для Drupal 7
try_files $uri @drupal;

## Это для Drupal 6 (оставить что-то одно)
try_files $uri /index.php?q=$no_slash_uri&$args;
}
}

# Все статические файлы обслуживаются непосредственно.

location ~* ^.+\.(?:css|cur|js|jpe?g|gif|htc|ico|png|html|xml)$ {
access_log off;
expires 30d;

# Посылать все сразу.
tcp_nodelay off;

# Настроить файловый кэш операционной системы 
open_file_cache max=3000 inactive=120s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2; 
open_file_cache_errors off;
}

# Обработка файлов PDF и powerpoint.
location ~* ^.+\.(?:pdf|pptx?)$ {
expires 30d; 

# Посылать все сразу. 
tcp_nodelay off;
}

Нa примере звуковых файлов демонстрируется использование асинхронного ввода-вывода. Местоположение MP3 выглядит так:

# МР3-файлы обслуживаются с использованием АIO, если ОС поддерживает.
location ^~ /sites/default/files/audio/mp3 {
location ~* ^/sites/default/files/audio/mp3/.*\.mp3$ {

А местоположение для файлов Ogg/Vorbis – так:

# Ogg/Vorbis-файлы обслуживаются с использованием АIO, если 
# ОС поддерживает.
location ^~ /sites/default/files/audio/ogg {
location ~* ^/sites/default/files/audio/ogg/.*\.ogg$ {

Следующие строки являются общими для обоих местоположений:

directio 4k; # for XFS
tcp_nopush off;
aio on;
output_buffers 1 2M;
}
}
# Псевдопотоковая передача FLV-файлов
location ^~ /sites/default/files/video/flv {
location ~* ^/sites/default/files/video/flv/.*\.flv$ {
flv;
}
}

Следующие две секции также похожи. Псевдопотоковая передача для H264-файлов настраивается так:

# Псевдопотоковая передача Н264-файлов.
location ^~ /sites/default/files/video/mp4 {
location ~* ^/sites/default/files/video/mp4/.*\.(?:mp4|mov)$ {

А псевдопотоковая передача для ААС-файлов – так:

# Псевдопотоковая передача ААС-файлов.
location ^~ /sites/default/files/video/m4a {
location ~* ^/sites/default/files/video/m4a/.*\.m4a$ {

Следующие строки являются общими для обеих секций:

mp4;
mp4_buffer_size 1M;
mp4_max_buffer_size 5M;
}
}

# Модуль Advanced Help делает доступным файлы README, 
# предоставленные всеми модулями.

location ^~ /help/ {
location ~* ^/help/[^/]*/README\.txt$ { include fastcgi_private_files.conf;
fastcgi_pass 127.0.0.1:9000;
}
}

# Копируем директиву Apache  для стандартного для# Drupal файла .htaccess.
# Запрещаем доступ ко всем файлам, содержащим код. 
# Возвращаем ошибку 404, чтобы не раскрывать информацию. 
# Также скрываем текстовые файлы.

location ~* ^(?:.+\.(?:htaccess|make|txt|engine|inc|info|install|module|profile|po|sh|.*sql|test|theme|tpl(?:\.
php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {return 404;}

# Сначала пробуем URI и перебрасываем на /index.php?q=$uri&$args, 
# если не найдено. try_files $uri @drupal;
## (Drupal 6) Сначала пробуем URI и перебрасываем на 
# /index.php?q=$no_slash_uri&$args, если не найдено
# (оставить что-то одно).

try_files $uri /index.php?q=$no_slash_uri&$args;

} 

# конец местоположения по умолчанию
# Ограничиваем доступ к обязательным файлам РНР. Сужаем
# область воздействия эксплойтов.
# цикла событий Drupal.

location @drupal {

# Включаем конфигурацию FastCGI. 
include fastcgi_drupal.conf; 
fastcgi_pass 127.0.0.1:9000;
}
location @drupal-no-args { 
include fastcgi_private_files.conf; 
fastcgi_pass 127.0.0.1:9000.
}

## (Drupal 6)
## Ограничиваем доступ к обязательным файлам РНР. Сужаем 
## область воздействия эксплойтов. Обработка РНР-кода и 
## цикла событий Drupal. 
## (оставить что-то одно)

location = /index.php {

# Помечен internal в качестве профилактической меры защиты.
# Прямой доступ к файлу index.php запрещен; доступ возможен 
# только со стороны NGINX из других местоположений или в 
# результате внутренней переадресации.

internal;
fastcgi_pass 127.0.0.1:9000;
}

Все последующие местоположения возвращают 404, чтобы запре-тить доступ:

# Запретить доступ к каталогу .git: возвращаем 404, чтобы не
# раскрывать информацию.
location ^~ /.git { return 404; }

# Запретить доступ к каталогу patches. 
location ^~ /patches { return 404; }

# Запретить доступ к каталогу backup. 
location ^~ /backup { return 404; }

# Запретить протоколирование обращений к файлу robots.txt в 
# журналах доступа.
location = /robots.txt {
access_log off;
}

# Поддержка RSS-каналов.
location = /rss.xml {
try_files $uri @drupal-no-args;
## (Drupal 6: оставить что-то одно)
try_files $uri /index.php?q=$uri;
}

# Поддержка карты сайта в формате XML.
location = /sitemap.xml {
try_files $uri @drupal-no-args;

## (Drupal 6: оставить что-то одно)
try_files $uri /index.php?q=$uri; }

# Поддержка favicon. Вернуть прозрачный GIF размером 1x1.
# если не существует.
location = /favicon.ico {
expires 30d;
try_files /favicon.ico @empty;
}

# Возвращает хранящийся в памяти прозрачный GIF размером 1x1
location @empty {
expires 30d;
empty_gif;
}

# Все прочие попытки обратиться к PHP-файлам возвращают 404. 
location ~* ^.+\.php$ {
return 404;
}
} 
# конец серверного контекста

Включаемые директивой include файлы здесь для краткости не приводятся. Их можно найти в репозитории perusio на сайте GitHub,упомянутом в начале этого раздела.