Статьи

Как использовать новую реликвию с PHP и WordPress

Ранее мы уже говорили о том, как настроить New Relic для приложения Rails , а также потратили много времени на изучение того, как использовать интерфейс New Relic . И хотя пользовательский интерфейс очень похож, независимо от языка и структуры, которые вы используете, на самом деле настройка New Relic может быть радикально отличаться. Сегодня мы рассмотрим, как контролировать приложение PHP с помощью New Relic. В частности, мы установим базовую установку WordPress и получим некоторые данные о производительности в инструментальных панелях New Relic.

Настройка New Relic для Ruby не зависит от среды. Мы просто добавляем гем агента в наше приложение, и в этот момент, независимо от того, как мы развернем наше приложение ( Passenger + Apache , Thin + Nginx и т. Д.), Гем выполнит остальную часть работы, чтобы гарантировать получение показателей производительности. С PHP-версией агента среда становится намного важнее, поскольку агент установлен и находится в той папке, где будет развернуто приложение, а не является частью какого-либо конкретного приложения.

Давайте настроим «песочницу», чтобы мы могли поиграть с ней (используя экземпляр EC2 ) и получить базовую установку и запуск WordPress.

Мы не будем вдаваться в подробности, так как большинство вещей, которые нам нужно сделать, хорошо документированы в другом месте. Но вот основная схема.

Нам нужно запустить экземпляр EC2 с Ubuntu Server 12.04 LTS . Если вы не хотите настраивать экземпляр EC2, вы можете просто создать виртуальную машину, используя VirtualBox (или ваш инструмент VM). Если вы настраиваете экземпляр EC2, вам необходимо помнить следующее:

  • загрузите ваш ключ (если вы создали новый во время процесса настройки), чтобы вы могли использовать SSH в своем экземпляре
  • добавьте дополнительное правило к любой группе безопасности, которую вы дадите своему экземпляру, чтобы разрешить HTTP-подключения к экземпляру (чтобы впоследствии мы могли получить доступ к нашему блогу WordPress через браузер)

Кроме того, все остальное должно быть довольно простым, и вы должны получить работающий экземпляр (или виртуальную машину), который готов к следующему шагу.

Теперь нам нужно установить Apache, PHP и MySQL . С Ubuntu Server, должно быть просто выполнить следующие команды:

1
2
sudo apt-get install tasksel
sudo tasksel install lamp-server

Вам нужно будет выбрать LAMP в пользовательском интерфейсе, и вам также нужно будет ввести свой пароль MySQL, когда будет предложено сделать это (я просто оставляю это поле пустым, так как мы не заботимся о том, чтобы это поле было каким-либо образом безопасным). После завершения установки мы можем запустить несколько команд, чтобы убедиться, что все установлено без проблем.

Сначала проверьте, установлен ли Apache:

01
02
03
04
05
06
07
08
09
10
11
ubuntu@ip-10-145-246-196:~$ apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
Server built: Jul 12 2013 13:37:10
Server’s Module Magic Number: 20051115:30
Server loaded: APR 1.4.6, APR-Util 1.3.12
Compiled using: APR 1.4.6, APR-Util 1.3.12
Architecture: 64-bit
Server MPM: Prefork
  threaded: no
    forked: yes (variable process count)

Во-вторых, проверьте, что у нас есть PHP:

01
02
03
04
05
06
07
08
09
10
11
ubuntu@ip-10-145-246-196:~$ php -i
phpinfo()
PHP Version => 5.3.10-1ubuntu3.10
 
System => Linux ip-10-145-246-196 3.2.0-58-virtual #88-Ubuntu SMP Tue Dec 3 17:58:13 UTC 2013 x86_64
Build Date => Feb 28 2014 23:13:16
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /etc/php5/cli
Loaded Configuration File => /etc/php5/cli/php.ini

А затем проверьте, что у нас есть MySQL:

1
2
ubuntu@ip-10-145-246-196:~$ mysql —version
mysql Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (x86_64) using readline 6.2

Нам также может понадобиться проверить, что PHP действительно включен в нашей конфигурации Apache, но, поскольку мы установили lamp-server с помощью tasksel мы можем быть почти уверены, что это так (и мы всегда можем сделать быстрый phpinfo() если действительно хотим проверить).

Теперь мы можем установить WordPress. Прежде чем мы действительно загрузим его, нам нужно настроить базу данных для него. Мы можем просто следовать инструкциям Кодекса :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
ubuntu@ip-10-145-246-196:~$ mysql
Welcome to the MySQL monitor.
Your MySQL connection id is 103
Server version: 5.5.35-0ubuntu0.12.04.2 (Ubuntu)
 
Type ‘help;’
  
mysql> CREATE DATABASE myblog1;
Query OK, 1 row affected (0.00 sec)
  
mysql> GRANT ALL PRIVILEGES ON myblog1.* TO «myblog1_user»@»localhost» IDENTIFIED BY «abc123»;
Query OK, 0 rows affected (0.00 sec)
   
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
 
mysql> EXIT
Bye

Я собираюсь назвать нашу новую установку myblog1 (поэтому база данных для нее также называется myblog1 ). Теперь нам нужно запустить следующие команды для запуска нашего блога (не забудьте sudo когда это необходимо):

1
2
3
4
5
6
cd /var/www
wget http://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
mv wordpress myblog1
cd myblog1
mv wp-config-sample.php wp-config.php

Теперь введите имя вашей базы данных, имя пользователя и пароль в файл конфигурации (имя хоста — localhost которое существует по умолчанию). На этом этапе вы сможете перейти в свой браузер, нажать правильный URL (в моем случае http://ec2-107-20-122-116.compute-1.amazonaws.com/myblog1 ), и WordPress сделает это. (возможно, не повредит перезапустить Apache перед sudo apache2 service restart ).

Наша песочница завершена, и мы можем начать установку New Relic.

Как я упоминал ранее, агент PHP New Relic находится на коробке, поэтому имеет смысл установить его с помощью диспетчера пакетов операционной системы ( apt-get поскольку мы используем Ubuntu). Первое, что нужно сделать, это импортировать ключ репозитория New Relic:

1
wget -O — https://download.newrelic.com/548C16BF.gpg |

Теперь добавим в систему сам репозиторий New Relic:

1
sudo sh -c ‘echo «deb http://apt.newrelic.com/debian/ newrelic non-free» > /etc/apt/sources.list.d/newrelic.list’

На данный момент мы можем использовать стандартные команды apt для установки агента:

1
2
sudo apt-get update
sudo apt-get install newrelic-php5

Это выбирает пакет агента PHP из репозитория и помещает скрипт установки агента в систему. Сценарий называется newrelic-install и находится в /usr/bin , поэтому вы сможете запускать его из любого места. Сценарий также несколько к сожалению назван, так как вы можете использовать его для установки и удаления New Relic из вашей системы. Чтобы установить New Relic, нам нужно запустить:

1
newrelic-install install

Сценарий является интерактивным и попросит вас ввести лицензионный ключ. Вы можете найти это, нажав большую красную кнопку при настройке нового приложения PHP в интерфейсе New Relic.

Если в вашей системе установлено несколько установок PHP, вам также будет предложено выбрать, для какой установки следует установить New Relic (вы можете выбрать любое количество установок, включая все). Если у вас есть только один PHP в вашей системе, сценарий просто использует его. Стоит отметить, что если ваша версия PHP старше 5.2, сценарий выручит, так как более старые версии не поддерживаются.

Если все идет хорошо, вы должны увидеть следующее сообщение:

1
New Relic is now installed on your system.

Затем скрипт распечатает для вас дополнительную информацию, включая расположение файлов журнала:

1
2
/var/log/newrelic/newrelic-daemon.log
/var/log/newrelic/php_agent.log

А также тот факт, что вам нужно перезагрузить веб-сервер (и PHP-FPM, если вы его используете).

Если вы перезапустите свой сервер и подключите лог демона, вы должны увидеть что-то вроде этого:

1
2
3
4
5
6
ubuntu@ip-10-145-246-196:/var/www/myblog1$ cat /var/log/newrelic/newrelic-daemon.log
2014-03-23 05:30:41.063 (2008/main) warning: current file limit of 1024 is too low — attempting to increase it
2014-03-23 05:30:41.064 (2008/main) info: increased file limit to 2048
2014-03-23 05:30:41.064 (2008/main) info: New Relic 4.6 (release build 40 — «quetzalcoatlus» — «e3d29c5a2e5dc1ee455e831d589ecf5e18c7d6f0») [workers=1 listen=’/tmp/.newrelic.sock’ pid=2008 ppid=2007 uid=0 euid=0 gid=0 egid=0 backtrace=no os=’Linux’ rel=’3.2.0-58-virtual’ mach=’x86_64′ ver=’#88-Ubuntu SMP Tue Dec 3 17′ node=’ip-10-145-246-196′ startup=agent]
2014-03-23 05:30:41.069 (2008/main) info: RPM config: proto=’https’ collector=’collector.newrelic.com’ proxy=’none’ certfile=’/etc/ssl/certs/ca-certificates.crt’ certdir=’/etc/ssl/certs’
2014-03-23 05:35:14.928 (2008/connector) info: [‘PHP Application’] ‘Reporting to: https://rpm.newrelic.com/accounts/232928/applications/3262356’

Что-то под названием PHP Application сообщает. Это несколько общего и совсем не похоже на наш блог WordPress, но это хорошее начало. Это означает, что все приложения на вашем веб-сервере запускаются и сообщают в New Relic как одно и то же приложение. Это приложение имеет имя по умолчанию приложения PHP .

В нашем случае, поскольку мы работаем только с одним приложением (наша установка WordPress), мы действительно можем перейти к интерфейсу New Relic и получить разумную статистику для нашего блога. Но, конечно, мы хотим дать нашему блогу лучшее имя и на всякий случай хотим, чтобы наш сервер обслуживал более одного приложения. Мы также хотим увидеть, как отделить приложения друг от друга. Вскоре мы рассмотрим, как это сделать, но прежде чем мы это сделаем, давайте посмотрим, что на самом деле составляет агент PHP.

Агент PHP New Relic состоит из двух частей. Первый — это расширение PHP, это общий объект, который называется newrelic.so . Если мы посмотрим на файл конфигурации агента:

1
/etc/php5/cli/conf.d/newrelic.ini

Мы можем видеть это перечисленное прямо наверху:

01
02
03
04
05
06
07
08
09
10
;
;
;
;
 
;
;
;
;
extension = «newrelic.so»

Это то, что на самом деле собирает статистику из ваших приложений, но не отправляет статистику в New Relic, это работа прокси-демона.

Демон агента — это прокси между расширением PHP и серверами New Relic. По сути, расширение PHP передает демону данные, которые он собирает, а демон выполняет такие действия, как его сборка и выяснение, когда отправить его на сервер. Вы должны всегда следить за тем, чтобы демон работал, иначе никакие данные не будут отправлены в New Relic. К счастью, по умолчанию при перезапуске сервера расширение PHP будет пытаться определить, запущен ли демон, и запустит его, если это не так.

У работающего прокси-демона есть два процесса. Один — это процесс мониторинга, а второй — рабочий. Рабочий фактически выполняет работу по связи с серверами New Relic, процесс мониторинга просто наблюдает за рабочим, и если работник по какой-либо причине умирает, он порождает новый. Вы можете остановить демон, запустив:

1
/etc/init.d/newrelic-daemon stop

Который отправит сигнал выключения процессу мониторинга. Процесс мониторинга затем уничтожит рабочий процесс, а затем отключится. Если вам когда-нибудь понадобится убить демона вручную, убедитесь, что вы сначала прервали процесс мониторинга, прежде чем убить работника (в противном случае, очевидно, появится новый работник).

Мы уже видели файл конфигурации агента PHP новой Relic /etc/php5/cli/conf.d/newrelic.ini . Агент и демон настраиваются с использованием этого файла.

Этот файл очень хорошо документирован со всеми параметрами и их значениями по умолчанию. Давайте поговорим о формате этого файла. Агент New Relic Ruby может быть настроен через YAML , который является широко известным форматом. Агент PHP — это просто текстовый файл, но нам нужна небольшая структура. Каждая переменная в файле имеет один из четырех типов (String, Boolean, Number, Duration). Строка и число говорят сами за себя, логические значения могут быть true , вкл или 1 для обозначения правдивости и false , в выключенном состоянии или 0 для обозначения ложности. Длительности — это строки определенного формата, например: "1w3d23h10m" означает одну неделю, три дня, 23 часа и десять минут. Значения длительностей могут быть такими же гранулярными, как микросекунды.

Все переменные в файле также имеют «область видимости». Возможны три области действия: SYSTEM, PERDIR и SCRIPT. Переменные с областью действия SYSTEM могут быть установлены только в глобальном файле конфигурации. Переменные с областью действия PERDIR можно задать в файле глобальной конфигурации, а также переопределить для каждого каталога. Переменные с областью действия скрипта могут быть глобальными для каждого каталога, а также могут быть переопределены программно.

Например, наиболее распространенной конфигурационной переменной является `newrelic.appname` . Эта переменная является строковым типом, она имеет значение по умолчанию PHP Application (теперь мы знаем, почему мы увидели это значение в файле журнала после того, как установили агент и перезапустили сервер). Область действия этой переменной — PERDIR, которая дает нам представление о том, как переопределить имя приложения для нашего блога WordPress.

Есть много других переменных, управляющих такими вещами, как расположение файлов журнала, независимо от того, записаны ли SQL-запросы, уровень журнала вывода журнала и так далее. Я рекомендую вам изучить файл newrelic.ini чтобы ознакомиться с параметрами.

Мы хотим увидеть отдельное приложение в интерфейсе New Relic для нашего блога на WordPress, поэтому давайте посмотрим, как мы можем это реализовать. Ваши параметры для каждой директории конфигурации различаются в зависимости от вашего стека. Если вы используете PHP-FPM , шаги отличаются от тех, которые вы используете Nginx. В нашем случае, поскольку у нас работает Apache, у нас есть два варианта.

Во-первых, если у нас есть виртуальный хост для нашего приложения, мы можем вставить блок IfModule в наш блок виртуального хоста и изменить имя приложения там:

1
2
3
4
5
<IfModule php5_module>
  php_value newrelic.appname «My Blog 1»
</IfModule>

Но у меня нет специального виртуального хоста только для блога, поэтому другой вариант — использовать файл .htaccess . Убедитесь, что вы действительно разрешаете файлы .htaccess , скопировав следующую информацию на ваш главный виртуальный хост:

1
2
3
4
5
6
<Directory /var/www/myblog1>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
</Directory>

Теперь мы можем поместить файл .htaccess каталог верхнего уровня нашего блога и поместить в него следующее:

1
php_value newrelic.appname «My Blog 1»

Формат точно такой же, как если бы я помещал его в блок IfModule . Теперь нам просто нужно отослать наш сервер. Если мы запишем логи демонов при перезапуске сервера, мы увидим следующее:

1
2
3
4
5
6
7
ubuntu@ip-10-145-246-196:/var/www/myblog1$ cat /var/log/newrelic/newrelic-daemon.log
2014-03-23 05:30:41.063 (2008/main) warning: current file limit of 1024 is too low — attempting to increase it
2014-03-23 05:30:41.064 (2008/main) info: increased file limit to 2048
2014-03-23 05:30:41.064 (2008/main) info: New Relic 4.6 (release build 40 — «quetzalcoatlus» — «e3d29c5a2e5dc1ee455e831d589ecf5e18c7d6f0») [workers=1 listen=’/tmp/.newrelic.sock’ pid=2008 ppid=2007 uid=0 euid=0 gid=0 egid=0 backtrace=no os=’Linux’ rel=’3.2.0-58-virtual’ mach=’x86_64′ ver=’#88-Ubuntu SMP Tue Dec 3 17′ node=’ip-10-145-246-196′ startup=agent]
2014-03-23 05:30:41.069 (2008/main) info: RPM config: proto=’https’ collector=’collector.newrelic.com’ proxy=’none’ certfile=’/etc/ssl/certs/ca-certificates.crt’ certdir=’/etc/ssl/certs’
2014-03-23 05:35:14.928 (2008/connector) info: [‘PHP Application’] ‘Reporting to: https://rpm.newrelic.com/accounts/232928/applications/3262356’
2014-03-23 06:07:58.768 (2008/connector) info: [‘My Blog 1’] ‘Reporting to: https://rpm.newrelic.com/accounts/232928/applications/3262424’

Приложение PHP все еще там, но теперь у него есть друг, наш блог на WordPress. И вот это в пользовательском интерфейсе:

Теперь мы будем получать метрики при просмотре нашего блога, как для интерфейса, так и для интерфейса администратора. Поскольку New Relic поддерживает WordPress «из коробки», метрики должны быть разумно разбиты (когда фреймворк не поддерживается, метрики будут, как правило, объединяться).

New Relic — это сложный программный продукт, и его стоит поддерживать в актуальном состоянии, так как ошибки исправляются регулярно и добавляются новые функции. Поскольку мы установили все с помощью apt-get, обновлять информацию очень просто. Мы просто делаем то же самое, что и для установки:

1
2
apt-get update
apt-get install newrelic-php5

Если мы не установили другой PHP в системе, нам просто нужно перезапустить наш сервер, и мы будем в курсе. Если есть новый PHP, нам может понадобиться перезапустить скрипт newrelic-install .

На все это есть только одно предостережение. В некоторых ситуациях вы можете запускать демон-посредник New Relic отдельно от агента, что означает, что перезапуск сервера не запускает автоматически демон, если он не запущен (это называется режимом внешнего демона). Для этого может быть несколько причин, например, вы можете захотеть, чтобы другой пользователь владел процессом демона, поэтому журналы видны только этому пользователю. В этой ситуации вы должны не только перезапустить сервер, но и перезапустить прокси-демон. Если вы этого не сделаете, вы увидите ошибки «несоответствие протокола» в журналах.

Как видите, настройка New Relic для приложения PHP сильно отличается от настройки для Ruby, ваше реальное приложение даже не учитывает процесс, а среда, в которой вы развертываете, является центральной. К счастью, это означает, что если вы используете какой-либо поддерживаемый PHP-фреймворк, процесс настройки New Relic точно такой же. Помимо WordPress, поддерживается большинство популярных PHP-фреймворков, включая Cake , Symphony и Laravel (версия 4 и выше). Также можно использовать New Relic с неподдерживаемым фреймворком, но вам придется приложить серьезные усилия, чтобы метрики имели смысл.