压缩
http {
include conf/mime.types;
gzip on;#开启压缩
gzip_min_length 800; #最低触发压缩的标准,如果不设置,则所有
gzip_comp_level 1; #压缩等级,1对cpu友好,9对带宽友好
gzip_disable "MSIE [1-6]\.";#ie1-6不支持gzip
gzip_buffers 4 8k; #4 8k代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
gzip_http_version 1.1; #识别http的协议版本。
#匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
gzip_types text/plain application/x-javascript text/css text/html application/xml;
}
限速
并发连接(cli->server)
http {
#用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接
#超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
limit_conn TotalConnLimitZone 50;
limit_conn_log_level notice;
}
请求速度(cli->server)
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server {
......
limit_req zone=req_one burst=5 nodelay;
location / {
limit_req zone=req_one burst=5 nodelay;
...
}
......
}
}
其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,
也可以放在location中只对单独的location有效。
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
- 第一个参数:$binaryremote_addr 表示通过remote_addr这个标识来做限制,“binary”的目的是缩写内存占用量,是限制同一客户端ip地址
- 第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
- 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的
limit_req zone=req_one burst=120;
- 第一个参数:zone=req_one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
- 第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内
- 第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队
带宽(cli->server)
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server {
location /download {
limit_req zone=req_one; #单个客户端1s只能访问一次
limit_rate_after 1m ; #在下载资源达到1m时开始限速,意思先快后慢,选配
limit_rate 50k ; #限制的速度为50k/s
}
}
}
CDN限速
cdn使用成本不断的降低,不管大小网站几乎都上cdn,那么问题就来了,通过$binary_remote_addr是拿不到真实用户ip的,我们不用把人家cdn的ip给限速了….
但是当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录(IP服务商的ip是高匿的,所以拿不到cli的真实ip)
X-Forwarded-For : 用户IP, 代理服务器IP
如果中间经历了不止一个代理服务器,这个记录会是这样
X-Forwarded-For : 用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….
http {
#$clientRealIp 拿到用户的真实ip
map $http_x_forwarded_for $clientRealIp {
#没有通过代理,直接用 remote_addr
"" $remote_addr;
#有代理,找到第一个ip地址
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
limit_req_zone $clientRealIp zone=req_one:10m rate=1r/s;
server {
location /download {
limit_req zone=req_one; #单个客户端1s只能访问一次
limit_rate_after 1m ; #在下载资源达到1m时开始限速
limit_rate 50k ; #限制的速度为50k/s
}
}
}
防盗链
location ~* /.(gif|jpg|png|jpeg)$ {
expires 30d;
valid_referers *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
if ($invalid_referer) {
rewrite ^/ https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1559729021896&di=938110bd90db9b2f680ff442a3827c3c&imgtype=0&src=http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FPibnQNJUOLXJX8yVXt3ScSM56BQ6hva6Tzrcc7sA7x2ich7EDQRtx2BibgLBcBFscdwASWqmLibiaib36Vm0zHvy9ibibg%2F640%3Fwx_fmt%3Dpng;
#return 404;
}
}
- 第三行:valid_referers有效的refer
- 第五行:rewrite ^/ https:….. 当验证失败时返回以一个链接,或直接return 404;