本文介绍如何使用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链接
- nginx: http : //nginx.net/
- nginx维基: http : //wiki.codemongers.com/Main
- HttpLimitReqModule: http : //wiki.nginx.org/NginxHttpLimitReqModule
关于作者
Falko Timme是所有者 Timme Hosting (超快nginx网页托管)。 他是youcl(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。