SHARE
TWEET

Untitled

artleg Nov 29th, 2012 2,694 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. В этом мануале мы попробуем настроить связку nginx и  php-fpm, так чтобы она могла работать на бесплатном тарифе. В уме мы держим, что в результате на этом сервере будет бежать drupal (весьма требовательный к ресурсам движок), но настройки подойдут и для массы других cms.
  2.  
  3. Надо сказать, что львиная доля этого how-to — это перепечатка (естественно с согласия авторов) статьи на [url=http://nixclub.pro/node/31]nixclub.pro[/url] Евгения Верещагина и Александра Кубашина, поскольку они написали, ну буквально про нас и написали хорошо.
  4.  
  5. Перед началом рекомендуем минимально настроить сервер с помощью [url=http://forum.serverscamp.com/viewtopic.php?f=14&t=202]этого[/url] руководства.
  6.  
  7. Далее текст перепечатки:
  8.  
  9. 0.0 Введение (или зачем эта статья)
  10.  
  11. В Сети очень много руководств по настройке отдельных частей и компонентов web-серверов, а вот вменяемого описания по настройке web-сервера от А до Я найти достаточно сложно. Данная статья является описанием нашего опыта по установке и настройке веб-сервера при ограниченном числе ресурсов.
  12.  
  13. 0.1 Что имеем:
  14.  
  15. Сервер в минимальной VPS-конфигурации: 5Gb HDD, 256Mb RAM.
  16. Debian Squeeze, в качестве системы.
  17. Желание поднять на этом "железе" сервер, на котором будет крутиться сайт под управлением Drupal 7.
  18. В перспективе иметь возможность поднять ещё несколько виртуальных доменов.
  19.  
  20. 0.2 Почему не Apache...
  21.  
  22. Apache является самым популярным сервером в современной Сети. Он имеет огромное число возможностей, много дополнительных модулей и кучу документации по настройке. Но невероятная гибкость Apache приводит к тому, что его грамотная настройка требует большого опыта (а поддержка web-серверов не является нашей профессиональной деятельностью), к тому же он весьма требователен к ресурсам, а мы в них очень ограничены.
  23.  
  24. 0.3 Наш выбор
  25.  
  26. В качестве решения для нашего сайта мы выбрали связку из Nginx и PHP-FPM. Если очень коротко и не совсем точно, то первый является "лёгким" http-сервером, а второй тем, кто будет обрабатывать php-скрипты.
  27.  
  28. 1.0 Поехали!
  29.  
  30. Найти пакет php5-fpm в официальных репозиториях Debian Squeeze не выйдет, нет его и в Backports. Зато есть очень достойный репозиторий на dotdeb.org, им мы и воспользуемся.
  31.  
  32. Прим. artleg: если вы воспользовались руководством про первоначальную настройку, то у вас уже добавлен этот репозиторий и ключ к нему.
  33.  
  34. 1.1 Подключение репозитория
  35.  
  36. Добавляем информацию о репозитории в систему
  37.  
  38. echo "deb http://packages.dotdeb.org squeeze all" > /etc/apt/sources.list.d/dotdeb.list
  39. Импортируем ключ
  40.  
  41. wget http://www.dotdeb.org/dotdeb.gpg
  42. cat dotdeb.gpg | apt-key add -
  43. Обновляем список пакетов
  44.  
  45. apt-get update
  46. 1.2 Установка основных пакетов
  47.  
  48. Прим. artleg: перед установкой рекомендуется убить процесс apache2, который запускается при каждом рестарте сервера (дефолтный конфиг openvz, который пока не переделан).
  49. killall apache2
  50.  
  51. apt-get install nginx php5-cli php5-common php5-suhosin php5-cgi php5-fpm mysql-server php5-mysql php5-gd
  52. Последние 3 нужны именно для Drupal (впрочем, и для большинства других сайтов).
  53.  
  54. Прим. artleg: поскольку на serverscamp.com к каждому тарифу предоставляется доступ и к  mysql-серверу, то рекомендую исключить mysql-server в целях облегчения оптимизации и экономии ресурсов.
  55.  
  56. 1.3 Создание каталога для сайтов и установка прав
  57.  
  58. Все наши сайты физически будут находится в каталоге /var/www, который в случае отсутсвия нужно создать командой:
  59.  
  60. mkdir /var/www
  61. Кроме того необходимо дать права на изменение этих файлов веб-серверу, точнее пользователю от которого он запущен (в Debian Nginx запускается от пользователя www-data). Команды по изменению владельца и установки соответствующих прав можно объединить в одну строку:
  62.  
  63. chmod -R a-rwx,u+rwX,g+rX /var/www && chown www-data:www-data -R /var/www
  64. После загрузки и распаковки движка, дополнений или обновлений необходимо выполнить эти команды повторно.
  65.  
  66. На этом разминка закончилась, переходим непосредственно к настройке.
  67.  
  68.  
  69. 2.0 Настройка Nginx
  70.  
  71. Несмотря на то, что конфигурация Nginx состоит из нескольких файлов, сам nginx начинает читать единственный файл: /etc/nginx/nginx.conf, все остальные подключаются директивой include. С него и начнём:
  72.  
  73. 2.1 /etc/nginx.conf
  74.  
  75. Прим. artleg:  у вас путь до конфига будет /etc/nginx/nginx.conf  
  76.  
  77. Большинство настроек (не все) повторяют конфиг, поставляемый с nginx, а наиболее интересные моменты снабжены комментариями.
  78.  
  79. user www-data;
  80. # Рекомендуется устанавливать по числу ядер
  81. worker_processes 1;
  82. pid /var/run/nginx.pid;
  83. # Директива уменьшает разрешение времени в рабочих процессах, за счёт чего уменьшается число системных вызовов gettimeofday().
  84. timer_resolution 100ms;
  85. worker_rlimit_nofile 8192;
  86. error_log  /var/log/nginx/error.log;
  87. events {
  88.     # Максимальное число подключений к серверу на один worker-процесс
  89.         worker_connections 1024;
  90.     # Эффективный метод обработки соединений, используемый в Linux 2.6+
  91.     use epoll;
  92. }
  93. http {
  94.         ##
  95.         # Базовые настройки
  96.         ##
  97.         sendfile on;
  98.         tcp_nopush on;
  99.         tcp_nodelay on;
  100.         keepalive_timeout 65; #Прим. artleg: часто имеет смысл уменьшить это значение, я выставляю 5
  101.         types_hash_max_size 2048;
  102.         # При ошибках не говорим врагу версию nginx
  103.         server_tokens off;
  104.         include /etc/nginx/mime.types;
  105.         default_type application/octet-stream;
  106.     ##
  107.     # Настройка логов
  108.     ##
  109.         access_log /var/log/nginx/access.log;
  110.         error_log /var/log/nginx/error.log;
  111.         ##
  112.         # Настройки сжатия
  113.         ##
  114.     gzip on;
  115.     gzip_disable "msie6";
  116.         ##
  117.         # Настройка виртуальных доменов
  118.         ##
  119.         include /etc/nginx/conf.d/*.conf;
  120.         include /etc/nginx/sites-enabled/*;
  121. }
  122. 2.1 Настройка виртуального домена
  123.  
  124. Прим. artleg: Рекомендуется просто ознакомиться с пунктом 2.1 данного руководства, а сделать по пункту 2.2 (см. ниже).
  125.  
  126. В стиле Debian все файлы настройки виртуальных доменов создаются в каталоге /etc/nginx/sites-available, а для того, чтобы этот домен активизировать нужно просто создать символическую ссылку на этот файл в каталоге /etc/nginx/sites-enable. Мы советуем не отходить от этой практики.
  127.  
  128. В качестве примера будем использовать домен test.nixclub.ru:
  129.  
  130. # Настрока редиректов c url вида http://foo.test.nixclub.ru/bar на url http://test.nixclub.ru/bar
  131. server {
  132.         listen 80;
  133.         server_name *.test.nixclub.pro;
  134.         rewrite ^(.*)$ http://test.nixclub.pro$1 permanent;
  135. }
  136.  
  137. # Настройка виртуального домена:
  138.  
  139. server {
  140.     ##
  141.     # Уникальные настройки для домена
  142.     ##
  143.     server_name test.nixclub.pro;
  144.     # Папка с контентом сайта (удобно, когда совпадает с именем домена)
  145.     root /var/www/test.nixclub.pro;
  146.     # Настройка логов, каждому виртуальному домену - свой лог
  147.     access_log /var/log/nginx/test.nixclub.pro-access.log;
  148.     error_log /var/log/nginx/test.nixclub.pro-error.log;
  149.     ##
  150.     # Типовые настройки общие для всех доменов (если не захочется экзотики)
  151.     ##
  152.     listen 80;
  153.     index index.php;
  154.     # Реализуем "красивые" ссылки для Drupal (и для ряда других CMS)
  155.     location / {
  156.     try_files $uri $uri/ /index.php?q=$uri&$args;
  157.     }
  158.     # Передаём обработку PHP-скриптов PHP-FPM
  159.     location ~ \.php$ {
  160.  
  161.   # Соединение по TCP.
  162.     fastcgi_pass   127.0.0.1:9000;
  163.     # На виртуальных хостингах VPS(OpenVZ, etc) полезно соединяться через сокет
  164.     # так как число TCP соединений может быть ограничено.
  165.     # (пример натройки php-fpm через сокет есть в разделе 3.5)
  166.     #Прим. artleg: на  serverscamp.com сокет следует располагать внутри папки /var/www что также будет полезно при настройке chroot php-fpm (см. ниже)
  167.     # fastcgi_pass   unix:/tmp/newpool.sock;
  168.  
  169.     fastcgi_index  index.php;
  170.     fastcgi_intercept_errors on; # только на период тестирования
  171.     # Включаем параметры из /etc/nginx/fastcgi_param
  172.     include fastcgi_params;
  173.     # Путь к скрипту, который будет передан в php-fpm
  174.     fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  175.     fastcgi_ignore_client_abort     off;
  176.     }
  177.     # Закрываем доступ к файлами .htaccess и .htpassword
  178.     location ~ /\.ht {
  179.         deny  all;
  180.     }
  181. }
  182.  
  183. 2.2 Шаблоны сайтов в nginx
  184.  
  185. Когда доменов становится много и почти все их параметры копируют друг друга, то начинаешь задумываться: а нельзя ли вынести повторяющиеся моменты в отдельный файл. Особенно остро необходимость в этом встаёт, когда нужно внести однотипные изменения сразу в десяток конфигурационных файлов.
  186. Чтобы решить эту проблему мы изначально поделили настойки на две части: уникальную для домена и типовую, общую для "большинства". Типовую часть можно вынести в файл /etc/nginx/templates/drupal (или любой другой, на Ваш вкус) и подключать её директивой include.
  187.  
  188. При таком подходе конфигурация домена будет выглядеть так:
  189.  
  190. server {
  191.         listen 80;
  192.         server_name *.test.nixclub.pro;
  193.         rewrite ^(.*)$ http://test.nixclub.pro$1 permanent;
  194. }
  195. server {
  196.     listen 80;
  197.     server_name test.nixclub.pro;
  198.     # Папка с контентом сайта (удобно, когда совпадает с именем домена)
  199.     root /var/www/test.nixclub.pro;
  200.     # Настройка логов, каждому виртуальному домену - свой лог
  201.     access_log /var/log/nginx/test.nixclub.pro-access.log;
  202.     error_log /var/log/nginx/test.nixclub.pro-error.log;
  203. # Подключаем шаблон
  204.  
  205. include /etc/nginx/templates/drupal;
  206.  
  207. }
  208.  
  209. А сам файл шаблона (/etc/nginx/templates/drupal) будет содержать следующие строки:
  210.  
  211.     index index.php;
  212.     # Реализуем "красивые" ссылки для Drupal (и для ряда других CMS)
  213.     location / {
  214.     try_files $uri $uri/ /index.php?q=$uri&$args;
  215.     }
  216.     # Передаём обработку PHP-скриптов PHP-FPM
  217.     location ~ \.php$ {
  218.     # Соединение по TCP.
  219.     fastcgi_pass   127.0.0.1:9000;
  220.     fastcgi_index  index.php;
  221.     fastcgi_intercept_errors on; # только на период тестирования
  222.     # Включаем параметры из /etc/nginx/fastcgi_param
  223.     include fastcgi_params;
  224.     # Путь к скрипту, который будет передан в php-fpm
  225.     fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  226.     fastcgi_ignore_client_abort     off;
  227.     }
  228.     # Закрываем доступ к файлами .htaccess и .htpassword
  229.     location ~ /\.ht {
  230.         deny  all;
  231.     }
  232. 2.3 Применение новых параметров
  233.  
  234. После изменения настроек nginx необходимо выполнить команду:
  235.  
  236. service nginx reload
  237.  
  238.  
  239. При этом работа сайта ни на мгновение не останавливается, а если допущена синтаксическая ошибка, то nginx сообщит об этом и продолжит работать с предыдущей (корректной) конфигурацией.
  240.  
  241. 2.4 Проверка работоспособности
  242.  
  243. Хотя подробная настройка PHP-FPM описана в следующем разделе, настроек по умолчанию вполне достаточно для проверки работы его связки с Nginx. Для этого мы создадим файл checkalive.php в корневом каталоге сайта (в нашем случае это /var/www/test.nixclub.pro/) следующего содержания:
  244.  
  245. <?php phpinfo(); ?>
  246.  
  247. И если конфигурация корректна, то при обращении к данному скрипту из веб-браузера (в нашем случае: http://test.nixclub.pro/checkalive.php) должна отобразится информация о текущих настройках PHP. Наличие этого скрипта на сервере является небезопасным, поэтому сразу после тестирования его лучше удалить!
  248.  
  249. Прим. artleg: Если  при переходе на http://test.nixclub.pro/checkalive.php вас встречает весёлая надпись «Welcome to nginx»,  то добавьте в каталог /var/www/test.nixclub.pro  пустой файл index.php, перейдите по адресу http://test.nixclub.pro/, а потом уже на http://test.nixclub.pro/checkalive.php
  250.  
  251. 2.5 .htaccess !
  252.  
  253. В Nginx нет никакого аналога апачевского .htaccess, поэтому если работа сайта требует его наличия, то придётся переписывать его содержание в соответствии с синтаксисом nginx в основную конфигурацию домена. В нашем конфиге .htaccess был заменён следующим блоком:
  254.  
  255.   location / {
  256.     try_files $uri $uri/ /index.php?q=$uri&$args;
  257.     }
  258.  
  259.  
  260. 3.0 Настройка PHP-FPM
  261.  
  262. Конфигурация PHP-FPM в Debian разбита на две части: глобальную (/etc/php5/fpm/php-fpm.conf) и настройки для так называемых пулов (/etc/php5/fpm/pool.d/*.conf). Глобальные настройки мы трогать не будем, а вот настройки для пулов обсудим достаточно подробно.
  263.  
  264. 3.1 Пулы
  265.  
  266. Для начала разберёмся зачем нужны пулы. В случае разных требований сайтов к PHP-окружению (различные параметры php.ini, разное число обработчиков и т.д.) может потребоваться создание дополнительных пулов. Данная операция в PHP-FPM весьма тривиально:
  267.  
  268. Настройка каждого пула в Debian представлена своим файлом в каталоге /etc/php5/fpm/pool.d/. По умолчанию системе есть единственный пул "www" (файл: /etc/php5/fpm/pool.d/www.conf) именно его настройкой мы и займёмся.
  269.  
  270. 3.2 Workers (обработчики)
  271.  
  272. Самая спорная часть в настройке пула, это количество обработчиков php-скриптов. На первый взгляд, кажется, что чем больше обработчиков, тем эффективней обрабатываются php-скрипты. Но это не так! Во-первых: большое число обработчиков расходует больше памяти (а для нашего сервера память весьма критичный ресурс), во-вторых: если обработчиков очень много и, так случилось, что все они реально заняты работой, то у сервера может просто не хватить ресурсов на другие задачи (даже есть вероятность, что подключение по SSH станет практически не возможным).
  273.  
  274. Из личного опыта: на сайте с ~200 посетителями в сутки, среднее число обработчиков за единицу времени существенно меньше 1. В идеале число обработчиков должно быть таким, что даже при стрессовой нагрузке LoadAvarage системы оставался в разумных пределах. Т.е. пусть лучше при высокой нагрузке пользователи периодически получают сообщения о недоступности сервиса (ошибка 502: Gateway timeout), чем полная недоступность сервера даже для администратора.
  275.  
  276. В результате тестирования (о тестировании будет написано дальше) были выбраны следующие параметры:
  277.  
  278.     # Выбираем динамический режим создания процессов, т.е.
  279.     # число запущенных процессов PHP-FPM будет зависеть от текущей нагрузки
  280.     pm = dynamic
  281.     # Максимальное количество дочерних процессов.
  282.     pm.max_children = 7
  283.  
  284.     # Количество дочерних процессов, стартующих сразу при загрузке сервера. Т.к. время запуска каждого
  285.     # нового процесса отлично от нулевого, то выбираем значение больше 1, не смотря на экономию ресурсов
  286.     pm.start_servers = 3
  287.  
  288.     # Минимальное чисто простаивающих процессов. Должен согласовываться по логике с предыдущими
  289.     # при экономии ресурсов будет удобно pm.start_servers = pm.min_spare_servers.
  290.     pm.min_spare_servers = 3
  291.  
  292.     # Максимальное чисто простаивающих процессов. Естественно, что не более чем pm.max_children
  293.     # и не менее pm.min_spare_servers. Остальные будут выгружены.
  294.     pm.max_spare_servers = 4
  295.  
  296. Считать эти параметры "серебрянной пулей" ни в коем случае нельзя! Оптимальное число обработчиков зависит от ресурсов сервера, сложности php-скриптов, нагрузки, создаваемой на mysql-сервер и т.д. В любом случае оптимальное число обработчиков нужно подбирать на основе тестирования работы сайта.
  297.  
  298.  
  299. Для запуска первого сайта на nginx данных настроек достаточно, далее идёт описание "продвинутых" возможностей PHP-FPM, некорректное использование которых может привести к "поломке" web-сервера.
  300.  
  301. 3.3 Slowlog
  302.  
  303. Очень полезно знать какие скрипты выполняются слишком долго и почему так происходит. Для помощи в решении этой проблемы в php-fpm есть следующие два параметра:
  304.  
  305.     # Если скрипт будет выполняться больше указанного времени, то отладочная информация по нему будет записана в файл "медленных" запросов
  306.     request_slowlog_timeout = 3s
  307.     # Определяет путь к файлу "медленных" запросов (обязательный параметр, в случае определения request_slowlog_timeout)
  308.     slowlog = /var/log/php-slow.log
  309.  
  310. 3.4 Chroot
  311.  
  312. PHP-FPM имеет очень полезную, с точки зрения безопасности, возможность: выполнение скриптов в chroot окружении. Активация данной функции производится одноимённым параметром, для примера:
  313.  
  314. # Устанавливаем chroot окружение в каталоге /var/www
  315. chroot = /var/www
  316. Эта единственная и достаточная настройка php-fpm для chroot. Но работа в chroot вносит свои коррективы во всё, что связано с обработкой скриптов:
  317. Во-первых, все пути php (error_log, sessions.save_path и т.д.) теперь будут относительными от директории /var/www.
  318. Во-вторых, php-скрипты не смогут обращаться к unix-сокетам находящимися за пределами этого каталога, т.е. обращение к mysql теперь нужно делать через tcp соединение (в качестве адреса сервера нужно указывать 127.0.0.1, но не localhost!).
  319. В третьих, не будет доступа к программам находящимися за пределами chroot. Если для отправки почты использовался /usr/sbin/sendmail, то придётся переводить работу скриптов на протокол smtp.
  320.  
  321. Теперь вернёмся к Nginx и обратим внимание на следующие строки внутри location ~ \.php$:
  322.  
  323.     # Путь к скрипту, который будет передан в php-fpm
  324.     fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  325. Пока php-скрипты выполнялись вне chroot окружения значение переменной $document_root (равна значению директивы root для текущего запроса)  для php и статического контента совпадало (было равно /var/www/test.nixclub.pro), но после изменения настроек требуется корректировка данного параметра:
  326.  
  327.     # Путь к скрипту в случае использования chroot
  328.     fastcgi_param       SCRIPT_FILENAME  /test.nixclub.pro$fastcgi_script_name;
  329. Т.е. нам просто нужно "укоротить" путь на значение chroot, другими словами, убрать из начала пути /var/www.
  330.  
  331. 3.5 Добавление пула
  332.  
  333. При увеличении числа обслуживаемых сайтов может понадобиться создание дополнительных пулов, для настройки различных параметров каждому сайту - своё. Данная операция в php-fpm, на наш взгляд, весьма тривиальна:
  334.  
  335. Нужно скопировать файл /etc/php5/fpm/pool.d/www.conf под новым именем (для примера назовём его newpool.conf)
  336. Дать новому пулу имя: находим вверху нового файла строку [www] (имя первого пула) и меняем на [newpool]
  337. Меняем адрес подключения к php-fpm (директива "listen"). Т.к. каждый адрес должен быть уникален, то нужно изменить:
  338. listen = 127.0.0.1:9000
  339. на
  340.  
  341. listen = 127.0.0.1:9001
  342. Или, в случае использования unix-сокетов,
  343.  
  344. listen = /tmp/newpool.sock
  345. Номера портов и путей к unix-сокетам во всех пулах должны быть разными!
  346.  
  347. 3.6 Применение параметров
  348.  
  349. Для применения параметров после изменения php.ini (для PHP-FPM полный путь к файлу выглядит так: /etc/php5/fpm/php.ini) или собственных настроек PHP-FPM требуется перезапуск сервиса, при этом выполнение php-скриптов приостанавливается (на небольшой период времени).
  350.  
  351. Перезапуск производится следующей командой:
  352.  
  353. service php5-fpm restart
  354.  
  355. 4.0 Немного об оптимизации
  356.  
  357. Грамотная оптимизация сервера требует наличия десятка сертификатов, нескольких тонн прочитанной литературы, огромного практического опыта и, конечно, правильной фазы луны. И это почти правда :)
  358. Далее мы будем заниматься "простой" оптимизацией, польза от которой, тем не менее, тоже весьма заметна.
  359.  
  360. 4.1 MySQL
  361.  
  362. Первое, что рекомендуют при оптимизации любой БД в Unix системах, это включение опции noatime для раздела с данными БД. При этом отключается запись информации о последнем обращении к файлам. Эту опцию нужно прописать в файл /etc/fstab в качестве параметра монтирования ФС. Для применения данного параметра без перезагрузки системы достаточно выполнить команду:
  363.  
  364. mount -o remount <точка монтирования раздела>
  365. Далее выполним оптимизацию таблиц mysql, это делается следующей командой:
  366.  
  367. mysqloptimize --analyze --all-databases -u root -p
  368. Информацию по приведённым параметрам можно (точнее нужно) посмотреть в справке по программе (man mysqloptimize).
  369. Следующим шагом будет использование утилиты MySQLTuner. Она входит в основной репозиторий Debian, поэтому её установка весьма тривиальна:
  370.  
  371. apt-get install mysqltuner
  372. Официальная документация рекомендует работу сервера хотя бы сутки, под типичной для него нагрузкой, перед использованием утилиты. А т.к. для достижения максимального эффекта нам придётся многократно запускать эту утилиту, то вместо суточного ожидания мы будем использовать короткое стресс-тестирование (подробное описание нагрузочного тестирования дано ниже).
  373.  
  374. При запуске утилиты будут запрошены логин и пароль администратора mysql, после чего будет выдан краткий анализ работы MySQL и набор параметров, которые рекомендуют добавить в конфигурацию сервера (/etc/mysql/my.cnf). После изменения параметров необходим перезапуск mysql:
  375.  
  376.  service mysql restart
  377. Наш алгоритм использования этой утилиты выглядит следующим образом:
  378.  
  379. Запускаем нагрузочное тестирования web-сервера (запоминаем результаты)
  380. Запускаем mysqltuner.
  381. Изменяем параметры mysql в соответствии с рекомендациями утилиты.
  382. Перезапускаем mysql.
  383. Возвращаемся к 1-му пункту. Цикл нужно повторять до тех пор пока не закончатся рекомендации mysqltuner (чуть подробее описано ниже).
  384. Очень часто mysqltuner при каждой итерации рекомендует увеличение одного и того же параметра (каждый раз на большее значение), причём даже после нескольких изменений подряд улучшения работы сервера нет (смотрите результаты стресс-тестирования). При этом нам известны два варианта: первый - параметр ещё не достиг значения при котором почувствуется эффект от его изменения (тут нужно просто набраться терпения и пройти ещё несколько итераций) и второй - эффект от данного параметра может и будет, но у нас просто не хватит на это ресурсов (т.е. если при очередной итерации Вам советуют выделить под какой-то параметр память сравнимую с общим объёмом в системе, а результата после этого всё равно нет, то нужно просто откатится на разумное значение этого параметра).
  385. По нашему опыту: подбор верных параметров может увеличить общую производительность web-сервера в несколько раз!
  386. Хотя данный набор советов весьма эффективен (как минимум для нас), но он не отменяет изучения официальной (и околоофициальной) документации по работе и оптимизации mysql сервера.
  387.  
  388. 4.2 PHP-APC
  389.  
  390. Один из самых простых способов ускорения выполнения php-скриптов, это установка php-акселератора. Есть несколько весьма известных программ этого типа, но мы остановили наш выбор на php-apc (во-первых: у нас есть опыт работы с ним, во-вторых: он есть в репозитории).
  391. Установка:
  392.  
  393. apt-get install php-apc
  394. service php5-fpm restart
  395. Уже после этих двух команд скорость выполнения php-скриптов должна возрасти, но при этом PHP-APC имеет более 30 параметров для настройки, грамотный подбор которых сможет ещё больше повысить производительность Вашей системы.
  396.  
  397. 4.3 Swap
  398.  
  399. Прим. artleg: на ovz серверах, которым является наш «atom» этот номер не пройдёт.  
  400.  
  401. Хостер пожертвовал нам 128Mb виртуальной памяти, но нам этого явно не достаточно (сервер просто переставал отвечать при тестировании под нагрузкой), поэтому добавим ещё 512Mb:
  402.  
  403. dd if=/dev/zero of=/swapfile bs=1M count=512
  404. mkswap /swapfile
  405. swapon /swapfile
  406. echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
  407. Если предыдущие советы рекомендуются к использованию на всех системах, то данный раздел больше применим при жёстком дефиците ресурсов.
  408.  
  409. 5.0 Нагрузочное тестирование
  410.  
  411. Само по себе стресс-тестирование нам просто скажет какую максимальную нагрузку сможет выдержать сервер при текущих настройках, но нам этого не достаточно. Наша задача включает поиск "узких" мест в работе системы: какая именно программа наиболее активно использует процессор, достаточно ли памяти, не взлетел ли LoadAvarage (если Вы до сих пор не знаете, что это такое, то самое время обратится в Google).
  412.  
  413. 5.1 Необходимое ПО
  414.  
  415. Во-первых, нам нужна сама утилита для нагрузочного тестирования веб-серверов. Мы остановили наш выбор на siege - это простой и при этом очень мощный инструмент. Во-вторых, нам нужна программа, отображающая текущую загрузку системы, для этих целей мы будем использовать htop (это более продвинутый вариант классической утилиты top).
  416.  
  417. Обе программы есть в стандартном репозитории, следовательно установка выглядит так:
  418.  
  419. apt-get install siege htop
  420. 5.2 htop
  421.  
  422. Интерфейс htop очень прост: Верхняя часть поделена на две зоны: слева отображается загрузка ядер CPU, использование памяти и swap, справа: информация по числу процессов, LoadAvarage (за 1, 5 и 15 минут) и общий uptime системы. В нижней части список процессов с наиболее полезной информацией по ним (использование CPU, памяти и т.д.).
  423.  
  424. При работе с программой удобнее всего включить сортировку процессов по утилизации CPU (наиболее "жадные" сверху) и всё время обращать внимание, на соотношение использования CPU и текущего LoadAvarage.
  425.  
  426. Для примера: если загрузка процессора далека от максимальной, память ещё не заканчивается, но при этом LoadAvarage через чур высок, то, скорее всего, узким местом является обращение к жёсткому диску (а в связке nginx+php+mysql именно последний наиболее активно его использует). Следовательно в этом случае нужно обратить больше внимания настройке mysql.
  427.  
  428. 5.3 Siege
  429.  
  430. Для начала краткое описание опций программы, которые мы будем использовать:
  431.  
  432. <число> -- число одновременно запускаемых запросов;
  433. -f <файл> -- файл содержащий набор ссылок, по которым будет обращаться программа во время тестирования;
  434. -i -- режим "internet", в этом режиме программ случайно выбирает адреса для запросов, список адресов задаётся параметром -f;
  435. -b -- режим "benchmark", все тесты при этом запускаются без пауз;
  436. -t -- время тестирования.
  437.  
  438. Перевод документации на русский можно найти здесь: http://habrahabr.ru/blogs/webdev/65128/ .
  439.  
  440. В простейшем случае тестирование можно запустить так:
  441.  
  442. siege <url>
  443. При этом в несколько потоков будет обращение к одному единственному <url>. Такой режим хоть и имеет определённый смысл, но сильно уступает варианту, когда программа в произвольном порядке обращается к различным адресам сайта. И здесь возникает вопрос: как получить карту сайта в формате, понимаемом, siege?
  444.  
  445. Почти все CMS (drupal не исключение) имеют встроенную функцию генерации файла sitemap.xml, для того чтобы его получить достаточно воспользоваться командой:
  446.  
  447. wget http://<домен сайта>/sitemap.xml
  448.  
  449. Для преобразования этого файла в формат siege мы воспользуемся одним из рецептов доступных по этой ссылке. А именно создадим файл sitemap2list.sh следующего содержания:
  450.  
  451. #! /bin/sh
  452. sed -r 's/<loc/\n<loc/g; s!</loc>!</loc>\n!g' $1 | sed -r -n '/<loc>.*?<\/loc>/! D; /<loc>.*?<\/loc>/ s!</?loc>!!g; s!\s+!!g; P'
  453. Не забываем установить права на исполнение:
  454.  
  455. chmod 755 sitemap2list.sh
  456. После этого преобразование выполняется следующей командой:
  457.  
  458. ./sitemap2list.sh sitemap.xml > usrl.txt
  459. Файл urls.txt получен, теперь можно запускать само тестирование:
  460.  
  461. siege -i -b -f urls.txt
  462. 5.4 Подбор числа обработчиков php-fpm
  463.  
  464. При подборе параметров мы воспользовались следующим методом (возможно это даже наше know-how):
  465.  
  466. Устанавливаем для php-fpm в качестве максимального числа обработчиков (параметр pm.max_children) заведомо большое значение, мы использовали 20.
  467. Производим набор тестов следующего вида:
  468. siege -i -b -t 1m -с <num> -f urls.txt
  469. При каждом новом тесте мы будем увеличивать <num> на 1 (т.е. при первом тесте <num> = 1, при втором 2 и т.д.). По достижении определённого значения <num> (у нас это было 8) число обработанных запросов в секунду начнёт уменьшаться, значит нам нужно выбрать значении предыдущего тестирования (для нас это 7) в качестве максимального числа обработчиков.
  470.  
  471. 5.5 Пример для MySQLTuner
  472.  
  473. Для стресс-тестирования во время настройки MySQLTuner мы пользовались следующей командой:
  474.  
  475. siege -i -b -t 2m -f urls.txt
  476. 6.0 Заключение
  477.  
  478. Однажды Мастер Никеда сказал своим ученикам:
  479. — В мире нет Абсолютной Истины.
  480. Один из учеников спросил:
  481. — А эта истина абсолютна?
  482. — Нет, конечно, — улыбнулся Мастер.
  483.  
  484. Восточная притча
  485.  
  486. Как Вы поняли, данная статья не претендует на "абсолютную истину", она даже не претендует на полноту, более того она не претендует даже на завершённость, единственное на что она может претендовать: быть отправной точкой при настройке своего web-сервера.
  487.  
  488. 6.1 Используемая литература:
  489.  
  490. Документация по nginx камрада Сысоева
  491. Статья на хабре, учтите мы нашли несколько ошибок в предлагаемом конфиге
  492. Перевод документации по siege на русский
  493. Скрипт преобразования sitemap.xml в формат siege, так же данный блог содержит много другой полезной информации
  494. Великий Google
  495.  
  496. 6.2 Занавес !
  497.  
  498. Здесь авторы благодарят дочитавших за терпение, выключают монитор и уходят пить чай с клубничным вареньем.
RAW Paste Data
Want to get better at Bash?
Learn to code Bash in 2017
Pastebin PRO Summer Special!
Get 40% OFF on Pastebin PRO accounts!
Top