Testen unserer Beispielanwendung

Im vorherigen Kapitel haben wir die grundlegende Verwendung der Apache Bench zum Testen einer Website eines Drittanbieters verstanden. In diesem Abschnitt verwenden wir dieses Tool, um eine Webanwendung auf unserem eigenen Server zu testen. Um das Tutorial so weit wie möglich in sich geschlossen zu halten, haben wir uns entschieden, zu Demonstrationszwecken eine Python-Anwendung zu installieren. Sie können jede andere Sprache wie PHP oder Ruby wählen, abhängig von Ihrem Kenntnisstand.

Python installieren

Im Allgemeinen wird Python standardmäßig auf Linux-Servern installiert.

Installieren des Bottle Frameworks und Erstellen einer einfachen Anwendung

Bottle ist ein in Python geschriebenes Mikro-Framework zum Erstellen von Webanwendungen, und pip ist ein Python-Paketmanager. Geben Sie den folgenden Befehl in das Terminal ein, um Bottle zu installieren -

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

Lassen Sie uns jetzt eine kleine Flaschenanwendung erstellen. Erstellen Sie dazu ein Verzeichnis und verschieben Sie es -

$ mkdir webapp
$ cd webapp

Wir werden ein neues Python-Skript erstellen, app.pyim Webapp-Verzeichnis -

$ vim app.py

Schreiben Sie nun den folgenden Code in die Datei 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)

Wenn Sie die obigen Zeilen hinzugefügt haben, speichern und schließen Sie die Datei. Nachdem wir die Datei gespeichert haben, können wir das Python-Skript ausführen, um die Anwendung zu starten.

$ python app.py

Output

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

Diese Ausgabe zeigt, dass unsere Anwendung auf dem lokalen Computer auf dem Host ausgeführt wird http://localhost und am Hafen lauschen 8080.

Lassen Sie uns überprüfen, ob unsere App ordnungsgemäß auf die HTTP-Anforderungen reagiert. Da dieses Terminal keine Eingaben vornehmen kann, ohne die Bottle-Anwendung zu beenden, müssen wir uns mit einem anderen Terminal bei unserem VPS anmelden. Nachdem Sie sich mit einem anderen Terminal beim VPS angemeldet haben, können Sie zu Ihrer Anwendung navigieren, indem Sie den folgenden Code in das neue Terminal eingeben.

$ lynx http://localhost:8080/

Lynx ist ein Befehlszeilenbrowser und wird normalerweise standardmäßig in verschiedenen Linux-Distributionen wie Debian und Ubuntu installiert. Wenn Sie die folgende Ausgabe sehen, bedeutet dies, dass Ihre App einwandfrei funktioniert.

Output

Wenn Sie die obige Ausgabe sehen, bedeutet dies, dass unsere Anwendung live und bereit zum Testen ist.

Testen der Anwendung mit Developmental Web Server

Bitte beachten Sie, dass in ab ein Fehler vorliegt und die Anwendung auf dem localhost nicht getestet werden kann. Daher werden wir den Host in der Datei app.py von localhost auf 127.0.0.1 ändern. Die Datei ändert sich also wie folgt:

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)

Lassen Sie uns nun unsere App testen, indem Sie den folgenden Befehl auf demselben Terminal eingeben, auf dem der Befehl lynx ausgeführt wurde:

$ 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)

Während der Ausgang am ersten Terminal (100-mal) wie folgt ist -

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

Sie können beobachten, wie sich die verschiedenen Werte des ab-Ergebnisses im Vergleich zum ersten Test geändert haben.

Testen der Anwendung mit einem Multithread-Webserver

In den vorherigen Tests von ab haben wir den Standard-Webserver verwendet, der im Bottle-Framework enthalten ist.

Jetzt werden wir den Single-Threaded-Standard-Webserver durch einen Multi-Threaded-Webserver ersetzen. Lassen Sie uns daher eine Multithread-Webserver-Bibliothek wie installierencherrypy oder gunicornund sag Bottle, dass sie es benutzen soll. Wir haben Gunicorn für den Demonstrationszweck hier ausgewählt (Sie können auch ein anderes auswählen) -

$  sudo apt-get install gunicorn

Und ändern Sie die Datei, dh vom Standard-Webserver zum Gunicorn -

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

Testen wir die App im zweiten 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)

Beobachten Sie, wie sich die Anforderungen pro Sekunde von 493 auf 3252 erhöht haben. Dies bedeutet, dass Gunicorn als Produktionsserver für Python-Apps geeignet ist.