Drupal: остаёмся без Apache. Nginx + php_fpm
Date March 16th, 2012 Author Vitaly Agapov
Конечно, лучший индеец – это мёртвый индеец.
Связка вида 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:
01.
[www]
02.
listen = /tmp/phpfpm.sock
03.
user = www-data
04.
group = www-data
05.
06.
pm = dynamic
07.
pm.max_children = 50
08.
pm.start_servers = 10
09.
pm.min_spare_servers = 5
10.
pm.max_spare_servers = 10
11.
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.
01.
server {
02.
server_name mydomain.com
03.
listen 80;
04.
root /var/www/mypath;
05.
location = /favicon.ico {
06.
log_not_found off;
07.
access_log off;
08.
}
09.
location = /robots.txt {
10.
allow all;
11.
log_not_found off;
12.
access_log off;
13.
}
14.
location = /backup {
15.
deny all;
16.
}
17.
location ~ \..*/.*\.php$ {
18.
# Лечим уязвимость связки nginx + php_fpm. Подробнее будет ниже
19.
return 403;
20.
}
21.
location / {
22.
# Проверяем наличие файла. В случае отсутствия - отправляем на index.php
23.
try_files $uri @rewrite;
24.
}
25.
location @rewrite {
26.
rewrite ^/(.*)$ /index.php;
27.
}
28.
location ~ \.php$ {
29.
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
30.
fastcgi_intercept_errors on;
31.
fastcgi_pass unix:/tmp/phpfpm.sock;
32.
fastcgi_index index.php;
33.
include /etc/nginx/fastcgi_params;
34.
}
35.
location ~ ^/sites/.*/files/imagecache/ {
36.
try_files $uri @rewrite;
37.
}
38.
# Стили для Drupal7
39.
location ~ ^/sites/.*/files/styles/ {
40.
try_files $uri @rewrite;
41.
}
42.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
43.
expires max;
44.
log_not_found off;
45.
}
46.
}
Этот конфиг предусматривает защиту от уязвимости, имеющейся в nginx + php_fpm. Второй возможный вариант решения проблемы – это дописать в php.ini:
cgi.fix_pathinfo=0
Ещё подробнее про уязвимость можно почитать на хабре.
Всё. Можно перезапускать Nginx, проверять сайт и останавливать Apache. Хороший индеец – мёртвый индеец.
Ссылки
Модуль ngx_http_fastcgi_module
Tags: Drupal, Nginx, PHP
Category:
Drupal, Nginx, Web-dev |
2 Comments »
12 May 2012 - 9:34
Хорошая статья, я тоже в последнее время стал использовать это решение.
Сюда бы еще APC поставить и все будет более менее быстро.
Кстати есть проект BOA (Barracuda Octopus Aegir) он позволяет существенно ускорить настройку веб-сервера, хотя веб-сервер получается достаточно специфический нужно его еще тюнить в плане кэширования, потому что этот проект “с нуля” устанавливает достаточно жесткие параметры этого самого кэширония.
Я написал небольшую статью по описанию данного проекта http://bit.ly/JMjJaS
Хороший блог, подписываюсь на RSS.
11 December 2012 - 13:48
Я использую xcache, но это уже отдельная тема.