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:
[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: 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, но это уже отдельная тема.