В посте Ansible: миграция RTFM 2.11 – хост Services – установка PHP, PHP-FPM я закончил на том, что надо протестировать работу связки NGINX+PHP-FPM+MariaDB для WordPress при использовании AWS EFS для файлов сайта.
Ниже результаты проверки при следующих вариантах использования NGINX + PHP-FPM:
- NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
- NGINX, PHP-FPM и MariaDB установлены локально, общаются через TCP-порт
- NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
- NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System
Используем AWS EC2 тип t2.nano, NGINX 1.10 и PHP 7.0 с дефолтными настройками, в качестве PHP приложения – WordPress версии 4.9.5.
Тестирование проводилось утилитой Apache Bench.
Содержание
Установка и настройка
Устанавливаем сейчас всё локально, на одной машине:
Для NGINX используем дефолтный конфиг с сайта NGINX, файл /etc/nginx/sites-enabled/default
:
upstream php { server unix:/run/php/php7.0-fpm.sock; # server 127.0.0.1:9000; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /var/www/html/; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }
В апстриме php
сейчас используем UNIX-сокет – server unix:/run/php/php7.0-fpm.sock
, далее переключим на TCP-порт.
Аналогично дефолтный пул www
для FPM, файл /etc/php/7.0/fpm/pool.d/www.conf
:
listen = /run/php/php7.0-fpm.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
Создаём базу и пользователя MySQL:
Устанавливаем WordPress и редактируем пост Hello, World, добавляем картинку, что бы потом точнее увидеть работу AWS EFS (картинка – спам такой приходил, сохранил скрин на память):
На домашней машинке устанавливаем Apache Bench из набор apache-tool
:
Приступим.
Тестирование
NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
Запускаем ab
с параметрами:
-c
100: клиентов одновременно-n
100: сделать 100 запросов (1 клиент делает 1 запрос)-k
: keep-alive, эмулируем браузер
Позже пробовал выполнять и 1000 запросов, т.е. 10 запросов с клиента – но картина особо не изменилась.
NGINX, PHP-FPM и MariaDB установлены локально, общаются через TCP-порт
Обновляем /etc/nginx/sites-enabled/default
, меняем апстрим:
upstream php { # server unix:/run/php/php7.0-fpm.sock; server 127.0.0.1:9000; } ...
И /etc/php/7.0/fpm/pool.d/www.conf
:
... ;listen = /run/php/php7.0-fpm.sock listen = 127.0.0.1:9000 ...
Перезапускаем их:
Тестируем:
NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
Запускаем второй инстанс – на нём будет PHP-FPM и MariaDB, устанавливаем PHP и MariaDB:
Подключаем EFS, повторяем на обоих серверах:
На PHP:
Переносим данные WordPress:
На втором интансе создаём базу:
Копируем базу со старого сервера на новый:
На втором хосте загружаем её:
Обновляем настройки MariaDB на втором хосте, в файле /etc/mysql/mariadb.conf.d/50-server.cnf
комментируем bind-address
:
... #bind-address = 127.0.0.1 ...
Перезапускаем MariaDB:
На втором хосте настраиваем FPM аналогично первому, но слушаем внешний IP:
[www] user = www-data group = www-data ;listen = /run/php/php7.0-fpm.sock listen = 0.0.0.0:9000 listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
На первом хосте обновляем NGINX – меняем IP апстрима с PHP-FPM и root
:
upstream php { # server unix:/run/php/php7.0-fpm.sock; # server 127.0.0.1:9000; server 34.243.225.196:9000; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /data; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }
Перезагружаем NGINX:
PHP на втором хосте:
Меняем адрес сервера баз данных в /data/wp-config.php
:
... /** MySQL hostname */ define('DB_HOST', '34.243.225.196'); ...
Повторяем тест:
На самом деле тут были не такие уж однозначные результаты – один раз был результат с 3447 (longest request) ms и Requests per second: 27.91 [#/sec].
Но большая часть выполнялась за +/- 1774(longest request) и Requests per second: 52.18 [#/sec].
NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System
Запускаем третью машину, устанавливаем там MariaDB:
Создаём базу, пользователя:
С первого хоста копируем дамп на третью машину:
На ней заливаем дамп в базу:
Обновляем /data/wp-config.php
, меняем IP сервера БД:
... /** MySQL hostname */ define('DB_HOST', '34.245.7.137'); ...
На третьем хосте с MariaDB обновляем /etc/mysql/mariadb.conf.d/50-server.cnf
, комментрируем bind-address
, перезапускаем, и повторяем тест:
Выводы
По сути – никакой ощутимой разницы в работе не заметил, хотя ab
с такими параметрами тут может быть и не лучшим показателем – в идеале было бы попользовать JMeter с какими-то дополнительными обходами по страницам.
Тем не менее результы получились такими:
- NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
- результат:
- Requests per second: 54.69 [#/sec] (mean)
- 1703 (longest request)
- результат:
- NGINX и PHP-FPM установлены локально, общаются через TCP-порт
- результат:
- Requests per second: 51.27 [#/sec] (mean)
- 1829 (longest request)
- результат:
- NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
- результат:
- Requests per second: 56.46 [#/sec] (mean)
- 1649 (longest request)
- результат:
- NGINX установлен на одном, PHP-FPM на втором, а MariaDB на третьем хосте, общаются через TCP-порт, файлы в AWS Elastic File System
- результат:
- Requests per second: 51.18 [#/sec] (mean)
- 1816 (longest request)
- результат:
Так что – можно пробовать использовать EFS.