网站压测

预计这个网站同时访问人数不会超过100人。

先用100人压了下

setUp(scn.inject(atOnceUsers(100))).protocols(httpProtocol)

一百个用户同时点会有报错,百分之八十请求在20秒内(20秒Orz)

1
1

换 heaviside 函数

setUp(scn.inject(heavisideUsers(100) over (60 seconds))).protocols(httpProtocol)

百分之九十五的用户能在20秒内打开博客任何一个页面

2
2

为啥这么慢

因为网站公网带宽只有1M哈哈哈哈,下面升级10M试试

3
3
立竿见影!

结论

没钱升级宽带,所以只能委屈用户了

限制Nginx请求数量

我网站里的页面打开时只会请求服务器一到两次,其它 js image css 全部走的CDN,所以限制每个IP每秒3次请求就差不多够了。为了防止 wifi 或者【电信局域网】的用户突然一起打开网站,我把 burst 留高一点到12

http 配置

# 全局限速配置
# 每个 ip: 3 r/s
# 每个ip 最多建立conn: 10
map $http_x_forwarded_for  $clientRealIp {
default $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}
map $clientRealIp $limit{
default $clientRealIp;
#1.1.1.1 "";
}

limit_req_status 429;
limit_req_log_level notice;
limit_conn_status 429;
limit_conn_log_level notice;

# 全局限制单个IP请求速率
limit_req_zone $limit zone=IpReqLimitZone:20m rate=3r/s;

# 全局限制单个IP可用链接数
limit_conn_zone $limit zone=IpConnLimitZone:20m ;
limit_conn  IpConnLimitZone 10;

#分别设置每个server的链接数
limit_conn_zone $server_name zone=ServerConnLimitZone:20m;

server 配置

# 限制当前 server 最多建立 10000个链接
limit_conn ServerConnLimitZone 10000;
# 限制每个ip 的速度为 3+12 r/s
limit_req  zone=IpReqLimitZone  burst=12  nodelay;

缩短超时时间

因为我的博客完全是静态资源,所以在没有超过出口带宽的情况下,一般请求应该立即返回,故而超时时间可以设置的非常小。真超过带宽了,那只要对不起了。。。

client_header_timeout 10;
client_body_timeout 10;
send_timeout 2;

看看限流后的效果
看看限流后的效果
一千人压测
一千人压测

压测的同时,我在手机上刷新博客丝毫不受影响,问题(不)完美解决。最终的结论是,在线用户数两百以内完全可以撑得住。