欢迎来到 岁月小筑

Nginx在使用CDN后,仍能对真实用户IP做并发限制的方法

前言

昨天偶然尝试了一下无限F5自己的小博客,然后,然后就没有然后了。

于是我痛下决心,卸了我的Apache,装了Apache+Nginx(纯Nginx对wordpress不友好),然后痛苦的发现,不能光卸载安装网站服务器….

最后,我选择安装了Tengine+Apache(据说Tengine比Nginx的并发性能好)(逃

需求

装好以后,我发现,F5我的博客还是得死(哭)。有句古话说得好,从哪里跌倒就从哪里爬起来。于是,我决定了,从床上爬起来,从失败中爬起,开始改装。

修改

使用有效的关键词搜索,能提高效率,直接百度:Nginx CDN 并发限制,然后就找到大神的文章了233

由于使用了CDN,因此Nginx不能直接获取到客户端IP,此时使用X-Forwarded-For即可。大部分的CDN都会在请求源站的时候添加一个X-Forwarded-For头来记录客户端IP,因此,从X-Forwarded-For下手即可。

当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录

X-Forwarded-For :  用户IP, 代理服务器IP

如果中间经历了不止一个代理服务器,这个记录会是这样

X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….

可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。

因为小站的配置不够,所以提高了点限制,加了CDN后和直接访问的效果是不一样的,经过多次修改测试后发现这个限制差不多了,大家也可以尝试去修改适合自己的。

修改nginx.conf(本站用的是Oneinstack的LNMP一键包,nginx.conf在/usr/local/nginx/conf/目录下),在

########################## vhost #############################
  include vhost/*.conf;
}

之前插入:

##########################IP LIMIT############################
## 这里取得原始用户的IP地址
map $http_x_forwarded_for  $clientRealIp {
        ""      $remote_addr;
        ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_conn_zone $clientRealIp zone=TotalConnLimitZone:20m ;
limit_conn TotalConnLimitZone 20;#根据自己的服务器配置进行修改
limit_conn_log_level notice;

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=ConnLimitZone:20m  rate=5r/s;#根据自己的服务器配置进行修改rate
#limit_req zone=ConnLimitZone burst=10 nodelay; #如果开启此条规则,burst=10的限制将会对所有网站,所有文件生效(慎用)
limit_req_log_level notice;

在vhost目录下,修改具体某个网站的conf:

#整站目录
location / {
#或只给动态文件
location ~ .*\.(php|php5|cgi|pl)?$ {
#中间插入以下代码
limit_req zone=ConnLimitZone burst=5 nodelay;#修改burst提高限制

好了,大功告成,最好还是修改一下,以适应自己的网站,避免蜘蛛爬取/用户刷新造成不必要的限制。

本文经过修改,转自【张戈博客】,与原文有所出入,原文地址:Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法

点赞

发表评论

电子邮件地址不会被公开。