如何测量服务器 POST 回复的响应时间 运行 CGI 脚本

How to measure response time of a POST reply from a server which is running a CGI script

我正在尝试在 Ubuntu VM 中的 Apache 中测量一个非常简单的服务 运行ning 的响应时间。该服务由一个 HTML 表单组成,该表单将发起一个 POST 请求,使用 CGI 脚本进行答复。 CGI 脚本只需要在表单中输入 2 个整数,对它们求和,然后 returns 一个包含结果的字符串。

通过浏览器访问虚拟机,单击表单按钮时,结果显示在新选项卡中。使用 Wireshark 可以轻松获得回复时间,但是,我想要做的是创建一个脚本,该脚本将发送一批请求并在一定的置信区间内获得平均值。我正在尝试使用请求库在 Python 中制作脚本。

我的问题如下:当我在测量脚本中使用 post 方法时,我没有收到回复,而是收到包含表格的初始网页。即使 post 方法默认将 allow_redirects 选项设置为 true。所以我不是在测量我的服务的响应时间,而是在测量获取表单的响应时间。我该怎么做才能解决这个问题?

我在下面提供了一个最小的可重现示例,只需按照步骤操作即可。

1 - 使用以下内容创建 master_script.sh 文件:

#!/bin/bash

#install apache2 and python2.x in Debian based VM
sudo apt-get update
sudo apt-get install apache2 python

#setting up virtual hosts
sudo mkdir /var/www/simple_server
sudo chown -R $USER:$USER /var/www/simple_server
sudo chmod -R 755 /var/www/simple_server

#copy webpage
cp index.html /var/www/simple_server

#copy virtual host conf file and enable it, disable default
sudo cp simple_server.conf /etc/apache2/sites-available
sudo a2ensite simple_server.conf
sudo a2dissite 000-default.conf

#copy cgi python script
sudo mkdir /var/www/simple_server/scripts
sudo chown -R $USER:$USER /var/www/simple_server/scripts
sudo chmod -R 755 /var/www/simple_server/scripts
sudo cp post_reply.py /var/www/simple_server/scripts
sudo chown -R $USER:$USER /var/www/simple_server/scripts/post_reply.py
sudo chmod -R 755 /var/www/simple_server/scripts/post_reply.py

#enable cgi
sudo a2enmod cgi

2 - 使用以下内容创建 simple_server.conf 文件:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName simple_server
    ServerAlias simple_server
    DocumentRoot /var/www/simple_server
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3 - 使用以下内容创建 index.html 文件:

<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to Simple CGI Server!</title>
    </head>
    <body>
        <h1>Simple CGI Server</h1>
    <h2>Input 2 numbers to be added</h2>
    <form action="scripts/post_reply.py" method="post" target="_blank">
         Operand 1: <input type="text" name="operand1"><br>
         Operand 2: <input type="text" name="operand2"><br>
         <input type="submit" value="Submit">
    </form>
    </body>
</html>

4 - 使用以下内容创建 post_reply.py 文件:

#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
#TEST
if "operand1" not in form or "operand2" not in form:
    print "Content-type:text/html\r\n\r\n"
    print "<html>"
    print "<head>"
    print "<title>CGI</title>"
    print "</head>"
    print "<body>"
    print "<h1>Error</h1>"
    print "There is some problem with post..."
    print "</body>"
    print "</html>"
else:
# Get data from fields
    op1 = int(form.getvalue('operand1'))
    op2 = int(form.getvalue('operand2'))
    sum = op1 + op2
    print "Content-type:text/html\r\n\r\n"
    print "<html>"
    print "<head>"
    print "<title>CGI</title>"
    print "</head>"
    print "<body>"
    print "<h2>The numbers add to %d</h2>" % sum
    print "</body>"
    print "</html>"

5 - 将 4 个文件和 运行 主脚本放在同一目录中。

6 - 将以下内容添加到 /etc/apache2 中的 apache2.conf:

<Directory /var/www/simple_server/scripts>
        Options +ExecCGI
        AddHandler cgi-script .py
</Directory>

7 - 重新启动 apache

sudo systemctl restart apache2

8 - 服务器现在可以运行了 - 通过在浏览器中输入 VM 的 IP 来测试它

9 - 最后,使用测量脚本访问服务器 - test.py

#!/usr/bin/python
import time
import requests

url = 'http://{THE-VM'S-IP-GOES-IN-HERE}'
myobj = {'operand1': 7, 'operand2': 5}

initial_time = time.clock()
x = requests.post(url, data = myobj)
final_time = time.clock() - initial_time

print(x.text)
print(final_time)

使用CGI脚本的URL代替索引页的URL即可解决问题。

在测量脚本(第 9 步)上更改:

url = 'http://{THE-VM'S-IP-GOES-IN-HERE}'

收件人:

url = 'http://{THE-VM'S-IP-GOES-IN-HERE}/scripts/post_reply.py'