重写后NGINX第二个limit_req无法正常工作

时间:2014-11-22 01:36:06

标签: php nginx rate-limiting

如果我直接点击php页面(index.php),这个limit_req配置是有效的,但如果它命中/ [漂亮网址]并且将其重写为index.php?$ args。

limit_req_zone $binary_remote_addr zone=dynamic:10M rate=1r/s;
limit_req_zone $binary_remote_addr zone=static:10M rate=60r/s;

location / {
            limit_req zone=static burst=180;
            try_files $uri $uri/ /index.php?$args;
    }

location ~ \.php$ {
            limit_req zone=dynamic burst=5;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;

            set $fsn /index.php;
            if (-f $document_root$fastcgi_script_name){
                    set $fsn $fastcgi_script_name;
            }

            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

它显然是到达正确的位置,因为它传递到后端,但似乎没有使用limit_req。我在文档中找不到任何讨论此限制的内容。有没有人有任何想法?

编辑:使用zone = static注释掉第一个允许php处理一个工作。对我来说,这看起来像是limit_req中的一个错误。

1 个答案:

答案 0 :(得分:0)

看起来这只是NGINX和limit_req模块的工作方式......也许将来它会变得更好。

经过大量的挖掘后,我发现了一个关于这个http://forum.nginx.org/read.php?2,223426,223431的nginx论坛帖子,看来下面的一个或两个都是真的(我没有兴趣深入研究这个)。

  • 如果使用try_files指令在'location'中使用limit_req,则不会使用将来的limit_req指令。
  • 可能是一旦某个位置处理limit_req指令,它们就不会在另一个“位置”处理,但单个“位置”中的多个limit_req应该可以正常工作。

到目前为止,我的配置解决方案是从/中删除limit_req并为静态文件设置新的位置正则表达式匹配,并在那里输入limit_req以获取静态数据。