我目前正在管理一个网站,该网站的用户有时会非常急于获取新内容,并频繁刷新页面,导致服务器负载过高并最终崩溃。
我尽可能地优化了网站,添加了服务器端缓存、修改了用户体验、提高了服务器容量等……但这还不够。
后来我发现 ngx_http_limit_req_module 确实能很好地完成这个任务。但是有一个问题:用户很有可能从某个特定的地方浏览网站,也就是说同一个 IP 地址。在这种情况下,即使浏览行为文明,也会触发限速。
如果可能的话,我希望能够具体识别每个用户,这样只有当单个用户过多刷新页面时才会触发请求率,而当许多使用同一 IP 的用户正常浏览网站时则不会触发请求率。
limit_req_zone 指令的语法如下:
limit_req_zone key zone=name:size rate=rate;
我目前正在使用类似这样的东西:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
这模块文档还添加这些信息:
键可以包含文本、变量及其组合。键值为空的请求不予处理。
和
在 1.7.6 版本之前,一个键只能包含一个变量。
我对 Nginx 几乎没有经验,但似乎可以找到一些解决方案。
因此我的问题是:是否存在一个变量可以识别唯一的用户,即使他们共享相同的 IP 地址?
非常感谢您的帮助 !
答案1
我终于找到了 ngx_http_userid_module这允许 Nginx 使用 cookie 识别用户。
配置此模块后,我只需要像这样更改 limit_req_zone 指令:
limit_req_zone $uid_got zone=one:10m rate=1r/s;
注意:如果您的 Nginx 安装中尚未包含此模块,则需要使用适当的参数重新编译它。如果您不熟悉此过程,这可能会很困难。