В посте 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
с параметрами:
-c
100: клиентов одновременно-n
100: сделать 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.