Testando nosso aplicativo de amostra

No capítulo anterior, entendemos o uso básico do Apache Bench para testar um site de terceiros. Nesta seção, usaremos essa ferramenta para testar um aplicativo da web em nosso próprio servidor. Para manter o tutorial independente na medida do possível, optamos por instalar um aplicativo Python para fins de demonstração; você pode escolher qualquer outra linguagem como PHP ou Ruby dependendo do seu nível de conhecimento.

Instalando Python

Geralmente, Python é instalado por padrão em servidores Linux.

Instalando o Bottle Framework e criando um aplicativo simples

Bottle é uma microestrutura escrita em python para criar aplicativos da web e pip é um gerenciador de pacotes python. Digite o seguinte comando no terminal para instalar o Bottle -

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

Vamos agora criar um pequeno aplicativo Bottle. Para isso, crie um diretório e mova dentro dele -

$ mkdir webapp
$ cd webapp

Vamos criar um novo script python, app.py, dentro do diretório webapp -

$ vim app.py

Agora, escreva o seguinte código no arquivo 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)

Depois de adicionar as linhas acima, salve e feche o arquivo. Depois de salvar o arquivo, podemos executar o script Python para iniciar o aplicativo -

$ python app.py

Output

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

Esta saída mostra que nosso aplicativo está sendo executado na máquina local no host http://localhost e ouvindo no porto 8080.

Vamos verificar se nosso aplicativo está respondendo adequadamente às solicitações HTTP. Como este terminal não pode receber nenhuma entrada sem parar de servir o aplicativo Bottle, precisamos fazer o login em nosso VPS com outro terminal. Depois de fazer o login no VPS com outro terminal, você pode navegar até seu aplicativo digitando o seguinte código no novo terminal.

$ lynx http://localhost:8080/

Lynx é um navegador de linha de comando e geralmente é instalado por padrão em várias distribuições Linux como Debian e Ubuntu. Se você vir a seguinte saída, significa que seu aplicativo está funcionando bem.

Output

Se você vir a saída acima, significa que nosso aplicativo está ativo e pronto para teste.

Testando o aplicativo com o servidor Web de desenvolvimento

Observe que há um bug no ab e não é possível testar o aplicativo no host local. Portanto, vamos alterar o host de localhost para 127.0.0.1 no arquivo app.py. Portanto, o arquivo será alterado para o seguinte -

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)

Vamos agora testar nosso aplicativo digitando o seguinte comando no mesmo terminal em que executou o 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)

Enquanto a saída no primeiro terminal será (100 vezes) como segue -

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

Você pode observar como os vários valores do resultado ab mudaram em comparação com o teste inicial.

Testando o aplicativo com um servidor Web multi-threaded

Nos testes anteriores de ab, usamos o servidor da web padrão empacotado no framework Bottle.

Agora vamos mudar o servidor da web padrão de thread único por um multi-thread. Portanto, vamos instalar uma biblioteca de servidor web multithread comocherrypy ou gunicorne diga a Bottle para usá-lo. Escolhemos o gunicorn para fins de demonstração aqui (você pode escolher outro também) -

$  sudo apt-get install gunicorn

E modifique o arquivo, ou seja, mude do servidor da web padrão para gunicorn -

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

Vamos testar o aplicativo no segundo 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 como as solicitações por segundo aumentaram de 493 para 3252. Isso significa que o gunicorn é adequado como um servidor de produção para aplicativos python.