В предыдущей главе мы понимали, как использовать Apache Bench для тестирования стороннего веб-сайта. В этом разделе мы будем использовать этот инструмент для тестирования веб-приложения на нашем собственном сервере. Чтобы сохранить самоучитель в максимально возможной степени, мы решили установить приложение Python для демонстрационных целей; Вы можете выбрать любой другой язык, например PHP или Ruby, в зависимости от вашего уровня знаний.
Установка Python
Обычно Python установлен по умолчанию на серверах Linux.
Установка Bottle Framework и создание простого приложения
Bottle — это микро-фреймворк, написанный на python для создания веб-приложений, а pip — менеджер пакетов python. Введите следующую команду в терминале, чтобы установить Bottle —
$ sudo apt-get install python-pip $ sudo pip install bottle
Давайте теперь создадим маленькое приложение Бутылка. Для этого создайте каталог и переместитесь в него —
$ mkdir webapp $ cd webapp
Мы создадим новый скрипт python app.py внутри каталога webapp —
$ vim app.py
Теперь напишите следующий код в файле app.py —
from bottle import Bottle, run app = Bottle() @app.route('/') @app.route('/hello') def hello(): return "Hello World!" run(app, host = 'localhost', port = 8080)
После добавления вышеуказанных строк сохраните и закройте файл. Сохранив файл, мы можем запустить скрипт python для запуска приложения —
$ python app.py
Выход
Bottle v0.12.7 server starting up (using WSGIRefServer())... Listening on http://localhost:8080/ Hit Ctrl-C to quit.
Эти выходные данные показывают, что наше приложение работает на локальной машине на хосте http: // localhost и прослушивает порт 8080 .
Давайте проверим, правильно ли наше приложение отвечает на запросы HTTP. Поскольку этот терминал не может принимать какие-либо входные данные без выхода из приложения «Бутылка», нам необходимо войти в систему нашего VPS с помощью другого терминала. После входа в VPS с помощью другого терминала вы можете перейти к своему приложению, введя следующий код в новом терминале.
$ lynx http://localhost:8080/
Lynx является браузером командной строки и обычно устанавливается по умолчанию в различных дистрибутивах Linux, таких как Debian и Ubuntu. Если вы видите следующий вывод, это означает, что ваше приложение работает нормально.
Выход
Если вы видите вывод выше, это означает, что наше приложение работает и готово к тестированию.
Тестирование приложения с помощью разработанного веб-сервера
Обратите внимание, что в ab есть ошибка, и она не может протестировать приложение на локальном хосте. Поэтому мы изменим хост с localhost на 127.0.0.1 в файле app.py. Таким образом, файл изменится на следующее —
from bottle import Bottle, run app = Bottle() @app.route('/') @app.route('/hello') def hello(): return "Hello World!" run(app, host = '127.0.0.1', port = 8080)
Давайте теперь протестируем наше приложение, набрав следующую команду на том же терминале, на котором выполнялась команда lynx:
$ ab -n 100 -c 10 http://127.0.0.1:8080/hello
Выход
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: WSGIServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /hello
Document Length: 12 bytes
Concurrency Level: 10
Time taken for tests: 0.203 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 16500 bytes
HTML transferred: 1200 bytes
Requests per second: 493.78 [#/sec] (mean)
Time per request: 20.252 [ms] (mean)
Time per request: 2.025 [ms] (mean, across all concurrent requests)
Transfer rate: 79.56 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 1 6 28.2 2 202
Waiting: 1 6 28.2 2 202
Total: 1 6 28.2 2 202
Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 2
80% 2
90% 2
95% 2
98% 202
99% 202
100% 202 (longest request)
В то время как выход на первом терминале будет (100 раз) следующим образом —
... 127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12 127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12 127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12 ...
Вы можете наблюдать, как различные значения исхода АБ изменились по сравнению с первоначальным тестом.
Тестирование приложения с многопоточным веб-сервером
В предыдущих тестах ab мы использовали веб-сервер по умолчанию, входящий в состав среды Bottle.
Теперь мы заменим однопоточный веб-сервер по умолчанию на многопоточный. Поэтому давайте установим многопоточную библиотеку веб-сервера, такую как cherrypy или gunicorn, и попросим Bottle использовать ее. Мы выбрали огнестрельное оружие для демонстрационных целей (вы можете выбрать и другое) —
$ sudo apt-get install gunicorn
И измените файл, то есть изменить с веб-сервера по умолчанию на gunicorn —
... run(server = 'gunicorn'...) ...
Давайте проверим приложение во втором терминале.
$ ab -n 100 -c 10 http://127.0.0.1:8080/hello
Выход
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: gunicorn/19.0.0
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /hello
Document Length: 12 bytes
Concurrency Level: 10
Time taken for tests: 0.031 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 17200 bytes
HTML transferred: 1200 bytes
Requests per second: 3252.77 [#/sec] (mean)
Time per request: 3.074 [ms] (mean)
Time per request: 0.307 [ms] (mean, across all concurrent requests)
Transfer rate: 546.36 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.9 0 4
Processing: 1 2 0.7 3 4
Waiting: 0 2 0.8 2 3
Total: 2 3 0.6 3 5
WARNING: The median and mean for the initial connection time are not within a normal
deviation These results are probably not that reliable.
WARNING: The median and mean for the processing time are not within a normal deviation
These results are probably not that reliable.
Percentage of the requests served within a certain time (ms)
50% 3
66% 3
75% 3
80% 3
90% 4
95% 5
98% 5
99% 5
100% 5 (longest request)
Посмотрите, как количество запросов в секунду увеличилось с 493 до 3252. Это означает, что gunicorn подходит в качестве рабочего сервера для приложений на Python.
