По "многочисленным" просьбам комментаторов статьи Настройка веб-сервера Nginx на Debian Squeeze как front-end к Apache cегодня рассмотрим очередной вариант ускорения Drupal путем настройкм веб-сервера без Apache. Сделаем это за счет применения связки Nginx + Php-fpm и задействуем APC (eaccelerator позже тоже попробуем).
В предыдущей статье мы настраивали Nginx как front-end к Apache для раздачи статики. С этой задачей Nginx справляется на отлично, но, к сожалению, nginx не имеет поддержки php, поэтому, чтобы польностью отказаться от Apache, мы будем использовать php-fpm (FastCGI Process Manager).
Принципе работы нашего веб-сервера будет следующим:
Настраивать, как уже наверное все догадались, будем на Debian Squezze. Тестовый сайт называется testdrupal.it-oblako.ru.
Обновляем локальный кэш пакетов:
apt-get update
Устанавливаем репозиторий dotdeb.org, вписываем в /etc/apt/sources.list следующую строку:
deb http://packages.dotdeb.org squeeze all
и выполняем команду
wget http://www.dotdeb.org/dotdeb.gpg && cat dotdeb.gpg | apt-key add -
Устанавливаем все компоненты:
apt-get install nginx php-fpm mysql-server php5-gd php5-mysql php5-apc
Конфигурация nginx выглядит следующим образом:
# Редирект с www.testdrupal.it-oblako.ru на testdrupal.it-oblako.ru
server {
server_name www.testdrupal.it-oblako.ru;
rewrite (.*) http://testdrupal.it-oblako.ru$1;
}
server {
listen 80;
server_name testdrupal.it-oblako.ru;
access_log /home/webmaster/domains/testdrupal.it-oblako.ru/logs/access.log;
error_log /home/webmaster/domains/testdrupal.it-oblako.ru/logs/error.log;
root /home/webmaster/domains/testdrupal.it-oblako.ru/html;
location / {
try_files $uri @drupal;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @drupal {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_read_timeout 600;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
}
}
Файл параметров тоже оставил дефолтный /etc/nginx/fastcgi_params
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
В файле /etc/php5/fpm/php-fpm.conf устанавливаем следующие параметры:
syslog.facility = daemon syslog.ident = php-fpm log_level = error emergency_restart_interval = 12h events.mechanism = epoll
Теперь переходим к настройке пула /etc/php5/fpm/pool.d/www.conf
user = webmaster group = webmaster pm = dynamic pm.max_requests = 1500 security.limit_extensions = .php php_admin_value[error_log] = /home/webmaster/domains/drupal-admin.ru/logs/fpm-php.www.error.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 256M php_admin_value[open_basedir] = "/home/webmaster:." php_admin_value[upload_tmp_dir] = "/home/webmaster/tmp" php_admin_value[session.save_path] = "/home/webmaster/tmp"
В данном случае тюнингом php-fpm я не занимался, поэтому использовал конфигурацию по умолчанию. В файле конфигурации /etc/php5/fpm/php-fpm.conf все достаточно подробно написано. Также можно обратиться к официальной документации.
Для настройки apc я использовал следующие параметры в файле /etc/php5/conf.d/apc.ini:
extension=apc.so ; Включаем APC apc.enabled=1 ; Количество сегментов памяти apc.shm_segments=1 ; Размер одного сегмента памяти apc.shm_size=64
Я провел небольшое тестирование скорости отдачи главной страницы сайта с 10000 нодов для зарегистрированных пользователей с помощью ab. Результат достаточно неплохой 17 страниц в секунду сервер делает без проблем.
Конфигурация сервера: VDS на хостинге it-oblako.ru, виртуализация KVM.
Оперативная память: 1 Гб
Процессор: Xeon 3 Ггц
Полное описание тестирования можно посмотреть здесь.
Комментарии
Гость (не проверено)
вт, 17/04/2012 - 21:45
Постоянная ссылка (Permalink)
Читал, что связка Nginx + Php
Читал, что связка Nginx + Php-fpm + Apc выигрышная только на тарифах с ограниченной оперативной памятью , если памяти хватает то Nginx + Apache + mod_php + Apc будет тоже хорошим решением т.е. не уступающим.
В чем плюс в остальном Php-fpm перед апачем ?
admin
вт, 17/04/2012 - 22:15
Постоянная ссылка (Permalink)
Я вижу разницу в том, что
Я вижу разницу в том, что Nginx + php-fpm + APC будет быстрее, чем Nginx + Apache + mod_php + APC, потому что не используется дополнительное звено Apache, который на каждом запросе будет тратить время на VirtualHost, на .htaccess, до того как обработать динамический запрос.
В целом для повышения производительности можно применять затюненный Apache в режиме Worker MPM. Кстати неплохо было бы сравнить на одном и том же железе Apache Worker MPM + mod_php vs Nginx + php-fpm. На abmysite.com пока что нет такого теста. Обязательно добавим.
Гость (не проверено)
чт, 19/04/2012 - 12:44
Постоянная ссылка (Permalink)
Вроде как drupal.ru работает
Вроде как drupal.ru работает на apache http://www.drupal.ru/about/hostings ...
admin
чт, 19/04/2012 - 13:16
Постоянная ссылка (Permalink)
Да, вижу используется Nginx +
Да, вижу используется Nginx + Apache. Подозреваю, что это особенность хостинга, где они сейчас размещаются. Я так понимаю этот хостинг использует именно связку Nginx + Apache в продакшн.
Думаю, что нужно проводить тесты разных конфигураций на одном и том же железе, чтобы найти оптимальную конфигурацию. Видимо drupal.ru нашел эту конфигурацию на этом хостинге.
mak (не проверено)
вс, 09/09/2012 - 18:23
Постоянная ссылка (Permalink)
Спасибо за статью, помогло
Спасибо за статью, помогло ускорить работу.
pr0g (не проверено)
вс, 16/12/2012 - 18:08
Постоянная ссылка (Permalink)
Привет!
Привет!
А друпал ни как не увидит что включен APC? Отчет статусов в Друпале выводит такую запись
С апачем он вроде писал что включен APC.
admin
вс, 16/12/2012 - 19:48
Постоянная ссылка (Permalink)
Попробуйте включить в apc.ini
Попробуйте включить в apc.ini строчку apc.rfc1867 = On и перезапустите php-fpm
Добавить комментарий