我正在开发一个facebook canvas应用程序,我想加载测试它。我知道facebook对自动化测试的限制,所以我通过创建一个在nginx下提供的虚假Web应用程序并将我的/ etc / hosts更改为指向graph.facebook.com到127.0.0.1来模拟图形api调用。
我正在使用jmeter对应用程序进行加载测试,模拟工作正常。现在我想模拟慢图api响应,看看它们如何影响我的应用程序。如何配置nginx以便为发送到模拟graph.facebook.com应用程序的每个请求插入延迟?
答案 0 :(得分:12)
您可以通过添加延迟来降低localhost(网络)的速度
使用ifconfig
命令查看网络设备:在localhost上可能是lo
,在LAN上是eth0
。
添加延迟使用此命令(在lo
网络设备上添加1000毫秒延迟)
tc qdisc add dev lo root netem delay 1000ms
改变延迟使用这个
tc qdisc change dev lo root netem delay 1ms
查看当前延迟
tc qdisc show dev lo
并删除延迟
tc qdisc del dev lo root netem delay 1000ms
答案 1 :(得分:3)
我之前的回答有效,但它更适合所有请求都需要放慢速度的情况。我已经提出了一个解决方案,只允许我根据具体情况打开速率限制,并提出以下配置。在使用之前一定要阅读完整的答案,因为要了解重要的细微差别。
location / {
if (-f somewhere/sensible/LIMIT) {
echo_sleep 1;
# Yes, we need this here too.
echo_exec /proxy$request_uri;
}
echo_exec /proxy$request_uri;
}
location /proxy/ {
internal;
# Ultimately, all this goes to a Django server.
proxy_pass http://django/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
重要提示:各种路径中是否存在正斜杠会产生影响。例如,proxy_pass http://django
没有尾部斜杠,不做与上面代码中的行相同的事情。
操作原理很简单。如果文件somewhere/sensible/LIMIT
存在,则匹配location /
的请求会暂停一秒钟,然后再继续。所以在我的测试套件中,当我想要网络减速时,我创建了文件,当我想删除减速时,我将其删除。 (我有清理代码,可以在每次测试之间删除它。)理论上我更喜欢使用变量而不是文件,但问题是每个请求都会重新初始化变量。所以我们不能有一个location
块来设置一个变量来转动限制,而另一个块来关闭它。 (这是我尝试过的第一件事,由于变量的生命周期而失败了)。可能会使用Perl模块或Lua来保存变量或者使用cookie,但我决定不再使用这些路径。
重要说明:
将echo
模块(如echo_sleep
和echo_exec
)中的指令与nginx的stock指令混合,导致生成a响应。我最初与echo_sleep
一起proxy_pass
并得到了糟糕的结果。这就是为什么我们有location /proxy/
块将股票指令与echo
的东西隔离开来的原因。 (有关通过拆分块解决的类似冲突,请参阅此issue。)
由于echo_exec
的工作方式,if
内外的两个if
指令是必需的。
internal
指令阻止客户直接请求/proxy/...
个网址。
答案 2 :(得分:2)
我修改了一个nginx配置,使用limit_req_zone
和limit_req
来引入延迟。以下内容将服务速率降低到每秒20个请求(rate=20r/s
)。我已设置burst=1000
,以便我的应用程序无法获得503响应。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
[...]
server {
[...]
location / {
limit_req zone=one burst=1000;
[...]
}
}
}
文档为here。我不相信有办法用这种方法指定统一延迟。