压缩

  1. http {
  2. include conf/mime.types;
  3. gzip on;#开启压缩
  4. gzip_min_length 800; #最低触发压缩的标准,如果不设置,则所有
  5. gzip_comp_level 1; #压缩等级,1对cpu友好,9对带宽友好
  6. gzip_disable "MSIE [1-6]\.";#ie1-6不支持gzip
  7. gzip_buffers 4 8k; #4 8k代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
  8. gzip_http_version 1.1; #识别http的协议版本。
  9. #匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
  10. gzip_types text/plain application/x-javascript text/css text/html application/xml;
  11. }

image.pngimage.png

限速

并发连接(cli->server)

  1. http {
  2. #用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接
  3. #超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了
  4. limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
  5. limit_conn TotalConnLimitZone 50;
  6. limit_conn_log_level notice;
  7. }

请求速度(cli->server)

  1. http{
  2. limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
  3. server {
  4. ......
  5. limit_req zone=req_one burst=5 nodelay;
  6. location / {
  7. limit_req zone=req_one burst=5 nodelay;
  8. ...
  9. }
  10. ......
  11. }
  12. }
  13. 其中“limit_req zone=req_one burst=120”既可以放在server层对整个server有效,
  14. 也可以放在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)

  1. http{
  2. limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
  3. server {
  4. location /download {
  5. limit_req zone=req_one; #单个客户端1s只能访问一次
  6. limit_rate_after 1m ; #在下载资源达到1m时开始限速,意思先快后慢,选配
  7. limit_rate 50k ; #限制的速度为50k/s
  8. }
  9. }
  10. }

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, ….

  1. http {
  2. #$clientRealIp 拿到用户的真实ip
  3. map $http_x_forwarded_for $clientRealIp {
  4. #没有通过代理,直接用 remote_addr
  5. "" $remote_addr;
  6. #有代理,找到第一个ip地址
  7. ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
  8. }
  9. limit_req_zone $clientRealIp zone=req_one:10m rate=1r/s;
  10. server {
  11. location /download {
  12. limit_req zone=req_one; #单个客户端1s只能访问一次
  13. limit_rate_after 1m ; #在下载资源达到1m时开始限速
  14. limit_rate 50k ; #限制的速度为50k/s
  15. }
  16. }
  17. }

防盗链

  1. location ~* /.(gif|jpg|png|jpeg)$ {
  2. expires 30d;
  3. valid_referers *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
  4. if ($invalid_referer) {
  5. 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;
  6. #return 404;
  7. }
  8. }
  • 第三行:valid_referers有效的refer
  • 第五行:rewrite ^/ https:….. 当验证失败时返回以一个链接,或直接return 404;