如何测量服务器 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'
我正在尝试在 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'