Drupal: остаёмся без Apache. Nginx + php_fpm

Date March 16th, 2012 Author Vitaly Agapov

Конечно, лучший индеец – это мёртвый индеец.

— Харуки Мураками «Охота на овец»

No Apache
Связка вида Apache + nginx всегда была для меня чем-то самим собой разумеющимся. Nginx отлично раздаёт статику, но не имеет поддержки php, perl, ajp и ещё многого нужного. Так бы и продолжалось дальше, но в какой-то момент я всё таки решил выкинуть одно звено из этой цепочки. И слабым звеном был признан Apache, не столько потому, что для работы сайта на Drupal он оказался совсем необязательным, а скорее из желания поэкспериментировать.

Целью эксперимента при этом вовсе не является желание ускорить работу сайта. Это всё-таки не Perl, где при переходе на FastCGI появляется изрядная прибавка в скорости выполнения, щедро оплачиваемая необходимостью переписывать код для совместимости с FastCGI. Но зато мы должны получить большую нагрузоустойчивость и меньший расход оперативной памяти сервера.

Настройка php-fpm

Для Ubuntu fpm-cgi лежит в репозиториях:

# apt-get install php5-fpm

Для Ubuntu 10.04 надо подключить заранее PPA, ибо этого пакета там ещё нету:

add-apt-repository ppa:brianmercer/php5
apt-get update
apt-get install php5-fpm

После установки надо изменить некоторые настройки. Мне, в частности, нравится использовать unix-сокет вместо TCP-порта для связки nginx и php. Правим /etc/php5/fpm/pool.d/www.conf:

[www]
listen = /tmp/phpfpm.sock
user = www-data
group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

Ещё полезно убрать версию PHP из HTTP-заголовков X-Powered-By. Для этого в /etc/php5/fpm/php.ini надо указать:

expose_php = Off

С остальными параметрами можно поиграться позже, на досуге. А пока:

# service php5-fpm restart

Настройка Nginx

Nginx должен быть скомпилирован с модулем ngx_http_fastcgi_module, который позволяет проксировать запросы на FastCGI-сервер.

Теперь настроим virtual host на Nginx.

server {
        server_name mydomain.com
	listen 80;
        root /var/www/mypath;
        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }
        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }
        location = /backup {
                deny all;
        }
        location ~ \..*/.*\.php$ {
                # Лечим уязвимость связки nginx + php_fpm. Подробнее будет ниже
                return 403;
        }
        location / {
                # Проверяем наличие файла. В случае отсутствия - отправляем на index.php
                try_files $uri @rewrite;
        }
        location @rewrite {
                rewrite ^/(.*)$ /index.php;
        }
        location ~ \.php$ {
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_intercept_errors on;
                fastcgi_pass unix:/tmp/phpfpm.sock;
                fastcgi_index  index.php;
                include        /etc/nginx/fastcgi_params;
        }
        location ~ ^/sites/.*/files/imagecache/ {
                try_files $uri @rewrite;
        }
        # Стили для Drupal7
        location ~ ^/sites/.*/files/styles/ {
                try_files $uri @rewrite;
        }
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Этот конфиг предусматривает защиту от уязвимости, имеющейся в nginx + php_fpm. Второй возможный вариант решения проблемы – это дописать в php.ini:

cgi.fix_pathinfo=0

Ещё подробнее про уязвимость можно почитать на хабре.

Всё. Можно перезапускать Nginx, проверять сайт и останавливать Apache. Хороший индеец – мёртвый индеец.

Ссылки

Модуль ngx_http_fastcgi_module

Tags: , ,
Category: Drupal, Nginx, Web-dev | 2 Comments »

Comments

2 комментариев на “Drupal: остаёмся без Apache. Nginx + php_fpm”

  1. Роман

    Хорошая статья, я тоже в последнее время стал использовать это решение.
    Сюда бы еще APC поставить и все будет более менее быстро.
    Кстати есть проект BOA (Barracuda Octopus Aegir) он позволяет существенно ускорить настройку веб-сервера, хотя веб-сервер получается достаточно специфический нужно его еще тюнить в плане кэширования, потому что этот проект “с нуля” устанавливает достаточно жесткие параметры этого самого кэширония.
    Я написал небольшую статью по описанию данного проекта http://bit.ly/JMjJaS
    Хороший блог, подписываюсь на RSS.

  2. Vitaly Agapov

    Я использую xcache, но это уже отдельная тема.

Leave a comment

 Comment Form