nginx的速率限制

本文介绍如何使用nginx HttpLimitReqModule来限制给定会话的请求数。 这是有用的,例如,如果您的网站被僵尸每秒钟执行多个请求,从而增加您的服务器负载。 使用HttpLimitReqModule,您可以定义速率限制,如果访问者超过此速率,他将收到503错误。

我不会保证这将为您工作!

1使用HttpLimitReqModule

打开你的nginx.conf ...

vi /etc/nginx/nginx.conf

...并定义存储会话状态的区域 - 这必须位于http {}容器内:

http {
    [...]
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    [...]
}

这个区域称为一个 ,并分配10MB的存储空间。 而不是变量$ remote_addr ,我们使用变量$ binary_remote_addr ,将状态的大小减小到64字节。 在1MB区域中可能有大约16,000个州,所以10MB允许大约16万个州,所以这应该足够你的访客。 速率限制在每秒一个请求。 请注意,您必须在此处使用整数值,因此如果您希望将限制设置为每秒半请求,则可以使用30r / m (每分钟30个请求)。

为了使这个限制工作,我们使用limit_req指令。 您可以在http {}服务器{}位置{}容器中使用此指令,但在我看来,它在将请求传递到应用程序服务器(PHP-FPM,mongrel等)的位置{}容器中最为有用否则,如果您加载了大量图像,CSS和JavaScript文件的单个页面,则可能会超过单个页面请求的给定速率限制。

所以我们把它放在一个位置〜\ .php $ {}容器中:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone = 1 burst = 5; 指定该速率限制属于我们之前定义的会话存储区域(因为zone = 1 ),这意味着速率限制为1r / s。 你可以想像一阵阵阵的爆发的意思。 这意味着如果您超过速率限制,则以下请求将被延迟,并且只有当队列中有更多的请求等于burst参数中指定的请求时,您会收到503错误(例如:

)。

如果您不想使用此队列(即如果有人超过限额限制,立即交付503),则必须使用nodelay选项:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

不要忘记重新加载nginx,使您的更改生效:

/etc/init.d/nginx reload

2链接

关于作者

Falko Timme是所有者 Timme Hosting (超快nginx网页托管)。 他是youcl(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏