Test de notre exemple d'application

Dans le chapitre précédent, nous avons compris l'utilisation de base d'Apache Bench pour tester un site Web tiers. Dans cette section, nous utiliserons cet outil pour tester une application Web sur notre propre serveur. Pour garder le tutoriel autonome dans la mesure du possible, nous avons choisi d'installer une application python à des fins de démonstration; vous pouvez choisir n'importe quel autre langage comme PHP ou Ruby en fonction de votre niveau d'expertise.

Installer Python

Généralement, Python est installé par défaut sur les serveurs Linux.

Installation de Bottle Framework et création d'une application simple

Bottle est un micro-framework écrit en python pour créer des applications Web, et pip est un gestionnaire de packages python. Tapez la commande suivante dans le terminal pour installer Bottle -

$ sudo apt-get install python-pip
$ sudo pip install bottle

Créons maintenant une petite application Bottle. Pour cela, créez un répertoire et déplacez-vous dedans -

$ mkdir webapp
$ cd webapp

Nous allons créer un nouveau script python, app.py, dans le répertoire webapp -

$ vim app.py

Maintenant, écrivez le code suivant dans le fichier 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)

Lorsque vous avez ajouté les lignes ci-dessus, enregistrez et fermez le fichier. Après avoir enregistré le fichier, nous pouvons exécuter le script python pour lancer l'application -

$ python app.py

Output

Bottle v0.12.7 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Cette sortie montre que notre application s'exécute sur la machine locale de l'hôte http://localhost et écoute sur le port 8080.

Vérifions si notre application répond correctement aux requêtes HTTP. Comme ce terminal ne peut accepter aucune entrée sans quitter l'application Bottle, nous devons nous connecter à notre VPS avec un autre terminal. Après vous être connecté au VPS avec un autre terminal, vous pouvez accéder à votre application en tapant le code suivant dans le nouveau terminal.

$ lynx http://localhost:8080/

Lynx est un navigateur en ligne de commande et est généralement installé par défaut dans diverses distributions Linux telles que Debian et Ubuntu. Si vous voyez la sortie suivante, cela signifie que votre application fonctionne correctement.

Output

Si vous voyez la sortie ci-dessus, cela signifie que notre application est en ligne et prête à être testée.

Test de l'application avec le serveur Web de développement

Veuillez noter qu'il y a un bogue dans ab, et qu'il ne peut pas tester l'application sur l'hôte local. Nous allons donc changer l'hôte de localhost en 127.0.0.1 dans le fichier app.py. Ainsi, le fichier changera comme suit -

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)

Testons maintenant notre application en tapant la commande suivante sur le même terminal sur lequel a exécuté la commande lynx -

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Output

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)

Alors que la sortie sur la première borne sera (100 fois) comme suit -

...
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   
...

Vous pouvez observer comment les différentes valeurs du résultat ab ont changé par rapport au test initial.

Test de l'application avec un serveur Web multithread

Dans les tests précédents de ab, nous avons utilisé le serveur Web par défaut fourni dans le framework Bottle.

Nous allons maintenant changer le serveur Web par défaut à un seul thread par un serveur à plusieurs threads. Par conséquent, installons une bibliothèque de serveur Web multi-thread commecherrypy ou gunicornet dites à Bottle de l'utiliser. Nous avons choisi gunicorn à des fins de démonstration ici (vous pouvez également en choisir un autre) -

$  sudo apt-get install gunicorn

Et modifiez le fichier, c'est-à-dire le changement du serveur Web par défaut en gunicorn -

...
run(server = 'gunicorn'...)
...

Testons l'application dans le deuxième terminal.

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Output

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)

Observez comment les requêtes par seconde sont passées de 493 à 3252. Cela signifie que gunicorn convient comme serveur de production pour les applications python.