В посте 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.
Содержание
Установка и настройка
Устанавливаем сейчас всё локально, на одной машине:
[simterm]
root@ip-172-31-35-170:~# apt update && apt install nginx php php-fpm php-mysql mariadb-server
[/simterm]
Для 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:
[simterm]
MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;
[/simterm]
Устанавливаем WordPress и редактируем пост Hello, World, добавляем картинку, что бы потом точнее увидеть работу AWS EFS (картинка — спам такой приходил, сохранил скрин на память):
На домашней машинке устанавливаем Apache Bench из набор apache-tool:
[simterm]
$ yaourt -S apache-tools
[/simterm]
Приступим.
Тестирование
NGINX, PHP-FPM и MariaDB установлены локально, общаются через UNIX-сокет
Запускаем ab с параметрами:
-c100: клиентов одновременно-n100: сделать 100 запросов (1 клиент делает 1 запрос)-k: keep-alive, эмулируем браузер
Позже пробовал выполнять и 1000 запросов, т.е. 10 запросов с клиента — но картина особо не изменилась.
[simterm]
$ ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software: nginx/1.10.3
Server Hostname: 54.154.228.143
Server Port: 80
Document Path: /2018/05/12/hello-world/
Document Length: 57663 bytes
Concurrency Level: 100
Time taken for tests: 1.828 seconds
Complete requests: 100
Failed requests: 0
Keep-Alive requests: 0
Total transferred: 5797200 bytes
HTML transferred: 5766300 bytes
Requests per second: 54.69 [#/sec] (mean)
Time per request: 1828.465 [ms] (mean)
Time per request: 18.285 [ms] (mean, across all concurrent requests)
Transfer rate: 3096.22 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 51 70 8.8 66 82
Processing: 186 969 364.1 968 1622
Waiting: 65 802 373.2 769 1462
Total: 237 1038 371.2 1023 1703
Percentage of the requests served within a certain time (ms)
50% 1023
66% 1215
75% 1384
80% 1433
90% 1602
95% 1625
98% 1667
99% 1703
100% 1703 (longest request)
[/simterm]
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 ...
Перезапускаем их:
[simterm]
root@ip-172-31-35-170:/var/www/html# service php7.0-fpm restart
root@ip-172-31-35-170:/var/www/html# service nginx reload
[/simterm]
Тестируем:
[simterm]
$ !511
ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software: nginx/1.10.3
Server Hostname: 54.154.228.143
Server Port: 80
Document Path: /2018/05/12/hello-world/
Document Length: 57663 bytes
Concurrency Level: 100
Time taken for tests: 1.950 seconds
Complete requests: 100
Failed requests: 0
Keep-Alive requests: 0
Total transferred: 5797200 bytes
HTML transferred: 5766300 bytes
Requests per second: 51.27 [#/sec] (mean)
Time per request: 1950.454 [ms] (mean)
Time per request: 19.505 [ms] (mean, across all concurrent requests)
Transfer rate: 2902.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 51 69 9.0 68 86
Processing: 266 999 435.7 1013 1743
Waiting: 63 809 431.3 823 1530
Total: 317 1068 444.5 1081 1829
Percentage of the requests served within a certain time (ms)
50% 1081
66% 1311
75% 1467
80% 1568
90% 1693
95% 1758
98% 1786
99% 1829
100% 1829 (longest request)
[/simterm]
NGINX установлен на одном, а PHP-FPM и MariaDB втором хосте, общаются через TCP-порт, файлы в AWS Elastic File System
Запускаем второй инстанс — на нём будет PHP-FPM и MariaDB, устанавливаем PHP и MariaDB:
[simterm]
root@ip-172-31-40-244:~# apt install nfs-common php php-fpm php-mysql mariadb-server
[/simterm]
Подключаем EFS, повторяем на обоих серверах:
[simterm]
root@ip-172-31-35-170:/var/www/html# mkdir /data
root@ip-172-31-35-170:/var/www/html# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 172.31.33.98:/ /data
[/simterm]
На PHP:
[simterm]
root@ip-172-31-40-244:~# mkdir /data
root@ip-172-31-40-244:~# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 172.31.33.98:/ /data
[/simterm]
Переносим данные WordPress:
[simterm]
root@ip-172-31-35-170:/var/www/html# cp -r /var/www/html/* /data/
[/simterm]
На втором интансе создаём базу:
[simterm]
MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;
[/simterm]
Копируем базу со старого сервера на новый:
[simterm]
root@ip-172-31-35-170:/var/www/html# mysqldump -u root -p wptest > wptest.sql
root@ip-172-31-35-170:/var/www/html# scp -i /home/ubuntu/.ssh/key.pem wptest.sql [email protected]:/home/ubuntu
[/simterm]
На втором хосте загружаем её:
[simterm]
root@ip-172-31-40-244:~# mysql -u root -p wptest < wptest.sql
[/simterm]
Обновляем настройки MariaDB на втором хосте, в файле /etc/mysql/mariadb.conf.d/50-server.cnf комментируем bind-address:
... #bind-address = 127.0.0.1 ...
Перезапускаем MariaDB:
[simterm]
root@ip-172-31-40-244:~# service mysql restart
[/simterm]
На втором хосте настраиваем 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:
[simterm]
root@ip-172-31-35-170:/var/www/html# nginx -t && service nginx reload
[/simterm]
PHP на втором хосте:
[simterm]
root@ip-172-31-40-244:~# service php7.0-fpm restart
[/simterm]
Меняем адрес сервера баз данных в /data/wp-config.php:
...
/** MySQL hostname */
define('DB_HOST', '34.243.225.196');
...
Повторяем тест:
[simterm]
$ ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software: nginx/1.10.3
Server Hostname: 54.154.228.143
Server Port: 80
Document Path: /2018/05/12/hello-world/
Document Length: 57663 bytes
Concurrency Level: 100
Time taken for tests: 1.771 seconds
Complete requests: 100
Failed requests: 0
Keep-Alive requests: 0
Total transferred: 5797200 bytes
HTML transferred: 5766300 bytes
Requests per second: 56.46 [#/sec] (mean)
Time per request: 1771.127 [ms] (mean)
Time per request: 17.711 [ms] (mean, across all concurrent requests)
Transfer rate: 3196.46 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 53 71 8.6 71 88
Processing: 281 916 385.0 941 1561
Waiting: 65 712 376.4 733 1343
Total: 334 988 393.0 1012 1649
Percentage of the requests served within a certain time (ms)
50% 1012
66% 1191
75% 1324
80% 1428
90% 1567
95% 1634
98% 1648
99% 1649
100% 1649 (longest request)
[/simterm]
На самом деле тут были не такие уж однозначные результаты — один раз был результат с 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:
[simterm]
root@ip-172-31-42-16:~# apt update && apt -y install mariadb-server
[/simterm]
Создаём базу, пользователя:
[simterm]
MariaDB [(none)]> create database wptest;
MariaDB [(none)]> grant all on wptest.* to ‘wptest’@’%’ identified by ‘wptest’;
[/simterm]
С первого хоста копируем дамп на третью машину:
[simterm]
root@ip-172-31-35-170:/var/www/html# scp -i /home/ubuntu/.ssh/key.pem wptest.sql [email protected]:/home/ubuntu
[/simterm]
На ней заливаем дамп в базу:
[simterm]
root@ip-172-31-42-16:~# mysql -u root -p wptest < wptest.sql
Enter password:
[/simterm]
Обновляем /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, перезапускаем, и повторяем тест:
[simterm]
$ ab -k -c 100 -n 100 http://54.154.228.143/2018/05/12/hello-world/
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 54.154.228.143 (be patient).....done
Server Software: nginx/1.10.3
Server Hostname: 54.154.228.143
Server Port: 80
Document Path: /2018/05/12/hello-world/
Document Length: 57663 bytes
Concurrency Level: 100
Time taken for tests: 1.954 seconds
Complete requests: 100
Failed requests: 0
Keep-Alive requests: 0
Total transferred: 5797200 bytes
HTML transferred: 5766300 bytes
Requests per second: 51.18 [#/sec] (mean)
Time per request: 1953.958 [ms] (mean)
Time per request: 19.540 [ms] (mean, across all concurrent requests)
Transfer rate: 2897.36 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 52 71 10.0 70 87
Processing: 273 1011 431.8 1024 1729
Waiting: 76 816 428.3 842 1543
Total: 329 1082 441.6 1099 1816
Percentage of the requests served within a certain time (ms)
50% 1099
66% 1321
75% 1480
80% 1548
90% 1722
95% 1810
98% 1814
99% 1816
100% 1816 (longest request)
[/simterm]
Выводы
По сути — никакой ощутимой разницы в работе не заметил, хотя 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.





