2017年3月

location ~* \.(gif|jpg|png|jpeg)$ {
                expires     30d;
                valid_referers *.baidu.com;
                if ($invalid_referer) {
                        rewrite ^/ http://www.susanguitar.com/Home/Index/cdn;
                #return 404;
        }
        }


location ~* \.(gif|jpg|png)$ {
                expires     30d;
                valid_referers images.baidu.com;
                if ($invalid_referer) {
                        rewrite ^/ /not.jpeg;
                #return 404;
        }
        }

测试发现只允许百度,其它域名src就出现not.jpeg

if ($invalid_referer != 1) {

就变成只禁止百度

$invalid_referer只返回0或1

location ~* \.(gif|jpg|png)$ {
                expires     30d;
                valid_referers image.baidu.com;
                if ($invalid_referer != 1) {
                        rewrite ^/ /not.jpeg;
                #return 404;

        }
        }

多域名,允许空header

location ~ .*\.(gif|jpg|jpeg|png)${
                valid_referers  none blocke  *.aaa.cn *.bbb.com *.cccc.com;
                if ($http_shw_rq_test = 1){
                        set $invalid_referer 0  ;
                }
                if ($invalid_referer) {
                        return 403;
                }

        }

花时间重新梳理了一下,不同的时候,阅读就有不同的体会.
http段

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=15r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

service 段

limit_req zone=one burst=5 nodelay;
limit_conn perip 20;
limit_conn perserver 5000;
limit_rate 100k;

关于
limit_req_zone $binary_remote_addr zone=one:10m rate=15r/s;
速度可以设置为用户每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可

以使用 “30r/m”

limit_req_zone  $binary_remote_addr  zone=one:10m   rate=15r/s;

server {
    location /www.abc.com/ {
limit_req zone=one;
        #limit_req zone=one burst=5;
#limit_req zone=one burst=5 nodelay;
    }
}

配置段: http, server, location

限制平均每秒不超过15个请求,同时允许超过频率限制的请求数不多于5个。(最多允许5个请求排队)

如果不希望超过的请求被延迟,可以用nodelay参数,如果没有nodelay参数,那么最多burst个excessive请求则按rate参数规定的速率延迟发送给后

端。如果有nodelay参数,则表示这些excessive请求会立马发送给后端。所以这种情况下,后端请求到达的速率可能不止rate这么多。

limit_req zone=one burst=5 nodelay;

limit_req zone=one; 严格限制发送给Tomcat端请求的速率是一秒一个,多的立即503返回。
limit_req zone=one burst=5; 严格限制发送给Tomcat端请求的速率也是一秒一个,nginx会缓存5个excessive请求,按rate指定的速率,

一秒一个发给Tomcat。因此日志中这三个请求在37s、38s、39s、40s被处理,第一个请求与被503快速返回的请求处理时间点32s刚好差5s的接口响

应时间。
limit_req zone=one burst=5 nodelay; 五个请求有6个被接收处理了,多的两个按503返回了。这被处理的三个请求,第一个是按rate规定

发送给Tomcat,剩下5个属于excessive请求,在nodelay参数作用下,与第一个请求一起一并发给Tomcat。因此几乎同时到达Tomcat的请求有四个!


limit_conn perip 20;
limit_conn perserver 5000;
limit_rate 100k;

补充说明下参数:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;