前言
昨天偶然尝试了一下无限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做并发访问限制的方法