Prueba de nuestra aplicación de muestra

En el capítulo anterior, entendimos el uso básico de Apache Bench para probar un sitio web de terceros. En esta sección, utilizaremos esta herramienta para probar una aplicación web en nuestro propio servidor. Para mantener el tutorial autónomo en la medida de lo posible, hemos optado por instalar una aplicación de Python con fines de demostración; puede elegir cualquier otro lenguaje como PHP o Ruby dependiendo de su nivel de experiencia.

Instalación de Python

Generalmente, Python se instala de forma predeterminada en los servidores Linux.

Instalación de Bottle Framework y creación de una aplicación simple

Bottle es un micro-framework escrito en Python para crear aplicaciones web, y pip es un administrador de paquetes de Python. Escriba el siguiente comando en la terminal para instalar Bottle -

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

Creemos ahora una pequeña aplicación Bottle. Para eso, cree un directorio y muévase dentro de él:

$ mkdir webapp
$ cd webapp

Crearemos un nuevo script de Python, app.py, dentro del directorio de aplicaciones web -

$ vim app.py

Ahora, escriba el siguiente código en el archivo 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)

Cuando haya agregado las líneas anteriores, guarde y cierre el archivo. Una vez guardado el archivo, podemos ejecutar el script de Python para iniciar la aplicación:

$ python app.py

Output

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

Este resultado muestra que nuestra aplicación se está ejecutando en la máquina local en el host http://localhost y escuchando en el puerto 8080.

Comprobemos si nuestra aplicación responde correctamente a las solicitudes HTTP. Como este terminal no puede tomar ninguna entrada sin dejar de servir la aplicación Bottle, debemos iniciar sesión en nuestro VPS con otro terminal. Después de iniciar sesión en el VPS con otro terminal, puede navegar a su aplicación escribiendo el siguiente código en el nuevo terminal.

$ lynx http://localhost:8080/

Lynx es un navegador de línea de comandos y generalmente se instala de forma predeterminada en varias distribuciones de Linux como Debian y Ubuntu. Si ve el siguiente resultado, significa que su aplicación está funcionando bien.

Output

Si ve el resultado anterior, significa que nuestra aplicación está activa y lista para la prueba.

Prueba de la aplicación con Developmental Web Server

Tenga en cuenta que hay un error en ab y que no puede probar la aplicación en el host local. Entonces, cambiaremos el host de localhost a 127.0.0.1 en el archivo app.py. Entonces el archivo cambiará a lo siguiente:

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)

Probemos ahora nuestra aplicación escribiendo el siguiente comando en la misma terminal en la que se ejecutó el comando 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)

Mientras que la salida en el primer terminal será (100 veces) como sigue:

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

Puede observar cómo han cambiado los distintos valores del resultado ab en comparación con la prueba inicial.

Prueba de la aplicación con un servidor web multiproceso

En las pruebas anteriores de ab, hemos utilizado el servidor web predeterminado incluido en el marco Bottle.

Ahora cambiaremos el servidor web predeterminado de un solo subproceso por uno de varios subprocesos. Por lo tanto, instalemos una biblioteca de servidor web multiproceso comocherrypy o gunicorny dile a Bottle que lo use. Hemos elegido gunicorn para el propósito de demostración aquí (también puede elegir otro):

$  sudo apt-get install gunicorn

Y modificar el archivo, es decir, cambiar del servidor web predeterminado a gunicorn -

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

Probemos la aplicación en la segunda 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)

Observe cómo las solicitudes por segundo aumentaron de 493 a 3252. Significa que gunicorn es adecuado como servidor de producción para aplicaciones de Python.