ip访问没问题 nginx ip访问出现502

& Nginx反向代理Nodejs – log4js日志IP显示错误
Nginx反向代理Nodejs – log4js日志IP显示错误
从零开始nodejs系列文章
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
blog: http://blog.fens.me
转载请注明出处:
为提高web应用的吞吐量,我们一般都用nginx做负载均衡器,再反向代理到真正的web服务器。像JAVA服务可以做成Nginx+Tomcat, PHP用Nginx+Spawn-fcgi, 当然nodejs服务,我们也可以做相同的架构Ngnix+Node。
我使用nginx+nodejs+log4js时,发现log4js日志的remote_addr项,总是显示127.0.0.1。本文将重点解释如何通过修改log4js的代码,解决这个问题。
我已经提交这个问题到log4js-node的issue
文章目录:
配置nginx反向代理
log4js做为web日志输出
log4js日志ip显示错误及修复
1. 配置nginx反向代理
本地启动nodejs : node app.js ,默认3000端口。
~ sudo apt-get install nginx
进入nginx配置目录
~ cd /etc/nginx/sites-enabled
/etc/nginx/sites-enabled
新建一个配置文件moive
~ vi moive
upstream nodejs__upstream {
server 127.0.0.1:3000;
#server 127.0.0.1:3001;
keepalive 64;
listen 80;
server_name www.moive.me moive.
access_log /var/log/nginx/moiveme.
location / {
proxy_set_header
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_
proxy_set_header
proxy_set_header
proxy_set_header
Connection "";
proxy_http_version 1.1;
proxy_pass
http://nodejs__
对配置项的解释:
listen,监听端口80
server_name , 监听域名 www.moive.me moive.me
access_log ,nginx日志输出 /var/log/nginx/moiveme.log
proxy_pass ,反向代理转发 http://nodejs__
通过upstream nodejs__upstream 可以配置多台nodejs节点,做负载均衡。
keepalive ,设置存活时间。如果不设置可能会产生大量的timewait。
重新启动nginx
~ sudo /etc/init.d/nginx restart
通过浏览器访问web站点
http://moive.me
2. log4js做为web日志输出
log4js的配置与使用,请查看
查看控制台日志,发现一个问题,客户端IP记录值都是127.0.0.1。这个是我们不期待的。
GET / 304 24ms
[ 06:55:39.405] [WARN] [default] - 127.0.0.1 - - "GET / HTTP/1.1" 304 - "" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/my.css 304 5ms
[ 06:55:39.646] [WARN] [default] - 127.0.0.1 - - "GET /css/my.css HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/bootstrap.min.css 304 4ms
[ 06:55:39.651] [WARN] [default] - 127.0.0.1 - - "GET /css/bootstrap.min.css HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /js/holder.js 304 3ms
[ 06:55:39.652] [WARN] [default] - 127.0.0.1 - - "GET /js/holder.js HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /js/jquery-1.9.1.min.js 304 4ms
[ 06:55:39.653] [WARN] [default] - 127.0.0.1 - - "GET /js/jquery-1.9.1.min.js HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
在浏览器通过IP直接访问,http://50.116.27.194:3000/, 所有的客户端IP显示正常。
GET / 304 12ms
[ 06:57:49.492] [WARN] [default] - 114.252.83.33 - - "GET / HTTP/1.1" 304 - "" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /js/holder.js 304 2ms
[ 06:57:49.720] [WARN] [default] - 114.252.83.33 - - "GET /js/holder.js HTTP/1.1" 304 - "http://50.116.27.194:3000/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/bootstrap.min.css 304 2ms
[ 06:57:49.723] [WARN] [default] - 114.252.83.33 - - "GET /css/bootstrap.min.css HTTP/1.1" 304 - "http://50.116.27.194:3000/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/my.css 304 2ms
[ 06:57:49.724] [WARN] [default] - 114.252.83.33 - - "GET /css/my.css HTTP/1.1" 304 - "http://50.116.27.194:3000/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
我们把问题定位在nginx转发出现的。
在程序中打印客户端IP。
~ vi routes/index.js
console.log("ip=&"+req.ip);
console.log("REMOTE_ADDR=&"+req.get['REMOTE_ADDR']);
console.log("HTTP_X_REAL_IP=&"+req.get['HTTP_X_REAL_IP']);
console.log("x-real-ip=&"+req.get['x-real-ip']);
console.log("x-forwarded-for=&"+req.get['x-forwarded-for']);
var headers = req.
console.log("headers=&"+ (headers['x-real-ip'] || headers['x-forwarded-for']));
console.log("headers x-real-ip=&"+headers['x-real-ip']);
console.log("headers x-forwarded-for=&"+headers['x-forwarded-for']);
console.log("====================================================");
var proxy_ip=headers['x-real-ip'] || headers['x-forwarded-for']
if(proxy_ip) return console.log("proxy"+proxy_ip);
if(req.ip) return console.log(req.ip);
console.log("====================================================");
http://moive.me, 通过nginx转发的输出结果:
[ 07:01:48.731] [INFO] console - ip=&127.0.0.1
[ 07:01:48.732] [INFO] console - REMOTE_ADDR=&undefined
[ 07:01:48.732] [INFO] console - HTTP_X_REAL_IP=&undefined
[ 07:01:48.732] [INFO] console - x-real-ip=&undefined
[ 07:01:48.732] [INFO] console - x-forwarded-for=&undefined
[ 07:01:48.732] [INFO] console - headers=&114.252.83.33
[ 07:01:48.732] [INFO] console - headers x-real-ip=&114.252.83.33
[ 07:01:48.732] [INFO] console - headers x-forwarded-for=&114.252.83.33
[ 07:01:48.732] [INFO] console - ====================================================
[ 07:01:48.733] [INFO] console - proxy114.252.83.33
[ 07:01:48.733] [INFO] console - req.ip127.0.0.1
http://50.116.27.194:3000, 直接通过IP访问的输出结果
[ 06:57:49.480] [INFO] console - ip=&114.252.83.33
[ 06:57:49.480] [INFO] console - REMOTE_ADDR=&undefined
[ 06:57:49.480] [INFO] console - HTTP_X_REAL_IP=&undefined
[ 06:57:49.481] [INFO] console - x-real-ip=&undefined
[ 06:57:49.481] [INFO] console - x-forwarded-for=&undefined
[ 06:57:49.481] [INFO] console - headers=&undefined
[ 06:57:49.481] [INFO] console - headers x-real-ip=&undefined
[ 06:57:49.481] [INFO] console - headers x-forwarded-for=&undefined
[ 06:57:49.481] [INFO] console - ====================================================
[ 06:57:49.482] [INFO] console - req.ip114.252.83.33
我们已经发现,通过nginx转发的客户端IP是不能直接使用express3框架中req.ip获得的,而是需要通过req.headers[‘x-real-ip’]和req.headers[‘x-forwarded-for’]才能得到。
3. log4js日志ip显示错误及修复
下面我们要再查一下log4js代码,看看他是怎么实现的,为什么会出现IP的错误。
打开 log4js/lib/connect-logger.js 118行
~ vi connect-logger.js
function format(str, req, res) {
return str
.replace(':url', req.originalUrl)
.replace(':method', req.method)
.replace(':status', res.__statusCode || res.statusCode)
.replace(':response-time', res.responseTime)
.replace(':date', new Date().toUTCString())
.replace(':referrer', req.headers['referer'] || req.headers['referrer'] || '')
.replace(':http-version', req.httpVersionMajor + '.' + req.httpVersionMinor)
.replace(':remote-addr',req.socket && (req.socket.remoteAddress || (req.socket.socket && req.socket.socket.remoteAddress)))
.replace(':user-agent', req.headers['user-agent'] || '')
.replace(':content-length', (res._headers && res._headers['content-length']) || (res.__headers && res.__headers['Content-Length']) || '-')
.replace(/:req\[([^\]]+)\]/g, function(_, field){ return req.headers[field.toLowerCase()]; })
.replace(/:res\[([^\]]+)\]/g, function(_, field){
return res._headers
? (res._headers[field.toLowerCase()] || res.__headers[field])
: (res.__headers && res.__headers[field]);
我们发现他的代码和express3的req.ip实现的代码是类似的,这样是不识别通过代理程序转发的客户端IP。
.replace(':remote-addr',req.socket && (req.socket.remoteAddress || (req.socket.socket && req.socket.socket.remoteAddress)))
下面对这行代码进行修改。
.replace(':remote-addr', req.headers['x-forwarded-for'] || req.connection.remoteAddress)
先检查不是转发的IP,再取默认IP。
重起nodejs服务器
浏览器访问测试。
http://moive.me
http://50.116.27.194:3000
[ 07:12:58.706] [WARN] [default] - 114.252.83.33 - - "GET / HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/bootstrap.min.css 304 5ms
[ 07:12:58.949] [WARN] [default] - 114.252.83.33 - - "GET /css/bootstrap.min.css HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /css/my.css 304 3ms
[ 07:12:59.153] [WARN] [default] - 114.252.83.33 - - "GET /css/my.css HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
GET /js/jquery-1.9.1.min.js 304 2ms
[ 07:12:59.156] [WARN] [default] - 114.252.83.33 - - "GET /js/jquery-1.9.1.min.js HTTP/1.1" 304 - "http://moive.me/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0. Safari/537.36"
两种访问测试都正常,解决了log4js通过nginx反向代理,日志IP显示错误的问题。
转载请注明出处:
This entry was posted in
Designed by新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分20阅读权限10帖子精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 20, 距离下一级还需 180 积分
帖子主题精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
我的架站平台是ubuntu+nginx,把/etc/nginx/sites-available文件夹下的default文件复制到/etc/conf.d下面,并修改root指向我的网页文件目录, server_name设置为我的public ip (210.A.B.host_id),端口使用默认的listen 80.
测试的时候发现,我们公司办公室的电脑可以直接通过ip访问我的网站的index.html,但是公司以外的ip就不能访问。我们公司是专线上网,每台电脑都是public ip, 我猜想可能在我们公司接入公网的时候有个防火墙,是不是我们的端口被公司的网管封掉了,导致公司外部的public ip无法链接服务器,而公司内部的public ip可以正常访问。
我是头一次练习架站,对一些常见故障不太了解,海望大家多多指点。谢谢。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分20阅读权限10帖子精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 20, 距离下一级还需 180 积分
帖子主题精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
补充说明,我怀疑是公司网管导的鬼的原因是:我们公司不仅限制每个人的上网流量,还封掉好多不健康的网站(就是那种蓝底网页,上面有个小方框,上书:您访问了被禁网站,您的上网行为将被记录)。
搭车问一问:怎么突破公司上网的流量限制?
(专线上网还限制流量,这不是浪费感情么?!)
UID2292276空间积分2 积分17283阅读权限90帖子精华可用积分17283 信誉积分2825 专家积分625 在线时间9509 小时注册时间最后登录
大富大贵, 积分 17283, 距离下一级还需 2717 积分
帖子主题精华可用积分17283 信誉积分2825 专家积分625 在线时间9509 小时注册时间最后登录
论坛徽章:6
IP是电信给你们的独立IP??
即使是独立的IP,那还是受限制,电信一般会封掉80端口。。。
有时候回答问题是信口开河......
因此不保证所有回复问题的答案的准确性.
如果正好是对的,那是碰到了死耗子..呵呵.
想着休息,不想做事!
UID空间积分0 积分20阅读权限10帖子精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 20, 距离下一级还需 180 积分
帖子主题精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
& & 我可以确定是public ip。我们单位用的是联通的专线,端口我换成其它端口(listen 36??),单位外面的ip仍然不能访问。。。
UID空间积分0 积分133阅读权限10帖子精华可用积分133 信誉积分349 专家积分0 在线时间70 小时注册时间最后登录
白手起家, 积分 133, 距离下一级还需 67 积分
帖子主题精华可用积分133 信誉积分349 专家积分0 在线时间70 小时注册时间最后登录
认证徽章论坛徽章:0
本帖最后由 蓝天上的青鸟 于
18:23 编辑
网管躺着也中枪
UID空间积分0 积分133阅读权限10帖子精华可用积分133 信誉积分349 专家积分0 在线时间70 小时注册时间最后登录
白手起家, 积分 133, 距离下一级还需 67 积分
帖子主题精华可用积分133 信誉积分349 专家积分0 在线时间70 小时注册时间最后登录
认证徽章论坛徽章:0
本帖最后由 蓝天上的青鸟 于
18:23 编辑
网管躺着也中枪
UID71828空间积分807 积分26859阅读权限100帖子精华可用积分26859 信誉积分1076 专家积分94 在线时间2063 小时注册时间最后登录
帖子主题精华可用积分26859 信誉积分1076 专家积分94 在线时间2063 小时注册时间最后登录
论坛徽章:0
这个问题排查起来很简单:
1. 确认NGINX监听了公网IP地址:
# netstat -an
2. 外网用户PING一下公网IP地址,确认网络没问题。
3. 如以上1-2均无问题,说明公司引入的线路关闭了相关服务器端口。
UID空间积分0 积分27982阅读权限90帖子精华可用积分27982 信誉积分2799 专家积分5 在线时间4105 小时注册时间最后登录
巨富豪门, 积分 27982, 距离下一级还需 12018 积分
帖子主题精华可用积分27982 信誉积分2799 专家积分5 在线时间4105 小时注册时间最后登录
认证徽章论坛徽章:24
没台都有public ip!!!有钱啊!!
NCLA11/NCLP11/RHCSA/RHCE/JNCIA/CCENT/CCNA/BCEFP/BCVRE/VCA-DCV/VCA-WM/VCA-Cloud/VCP5-DCV/VCP-NV/VCP6-DT/VCP6-DTM/VCP6-Cloud/VCP6-CMA/VCP6-NV/VCAP5-DCD/VCAP5-DCA/VCIX-NV/CCA-V/CCP-V/Microsoft Certified Associate Hyper-V Advisory Staff/MCP/MS SVWSHvSCC在手。
UID空间积分0 积分20阅读权限10帖子精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 20, 距离下一级还需 180 积分
帖子主题精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
llzqq 发表于
这个问题排查起来很简单:
1. 确认NGINX监听了公网IP地址:
恩,好的。您的回复给了我一个思路,我晚上研究研究。
UID空间积分0 积分20阅读权限10帖子精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
白手起家, 积分 20, 距离下一级还需 180 积分
帖子主题精华可用积分20 信誉积分160 专家积分0 在线时间20 小时注册时间最后登录
论坛徽章:0
Hongqiyaodao 发表于
没台都有public ip!!!有钱啊!!
原来用public ip还要钱啊? 我以为从联通搞个专线后,联通要送若干个ip呢。
我觉得单位真是蛋疼,既然花这么多钱搞专线,还要封一些网站,还要限制每天的流量~~nginx出现502、504等错误状态的解决方法
11:36:55&&&来源:&&&评论: 点击:
当发现nginx后端服务器不可用,直接访问那台后台的服务器的时候,返回的是404页,nginx配置的upstream 里面设置了ip_hash。所以导致网页404
&当nginx后端服务器不可用,直接访问那台服务器的时候,会返回404错误页,这是因为nginx配置的upstream 里面设置了ip_hash。所以导致网页404错误。
由此想到了nginx的一个功能,就是当后端的服务器返回给nginx502、504、404、执行超时等错误状态的时候,
nginx会自动再把这个请求转发到upstream里面别的服务器上面,从而给网站用户提供更稳定、高可用性的服务。&
配置如下:
location /
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_
proxy_pass http://php_server_
proxy_set_header H
proxy_set_header X-Forwarded-For $remote_
原文标题:nginx出现502、504等错误状态的解决方法
原文地址:
版权归网络时代所有,转载请注明出处
相关热词搜索:
频道总排行
频道本月排行& nginx限制某个IP同一时间段的访问次数
nginx限制某个IP同一时间段的访问次数
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。
cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。
HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令
这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制
HttpLimitReqModul 限制某一段时间内同一ip访问数实例
&&&&#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
&&&&#以$binary_remote_addr&为key,限制平均每秒的请求为20个,
&&&&#1M能存储16000个状态,rete的值必须为整数,
&&&&#如果限制两秒钟一个请求,可以设置成30r/m
&&&&limit_req_zone&$binary_remote_addr&zone=allips:10m&rate=20r/s;
&&&&server{
&&&&&&&&...
&&&&&&&&location&{
&&&&&&&&&&&&...
&&&&&&&&&&&&#限制每ip每秒不超过20个请求,漏桶数burst为5
&&&&&&&&&&&&#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
&&&&&&&&&&&&#第5秒的请求为25个是被允许的。
&&&&&&&&&&&&#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
&&&&&&&&&&&&#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
&&&&&&&&&&&&#第1秒25个请求时,5个请求放到第2秒执行,
&&&&&&&&&&&&#设置nodelay,25个请求将在第1秒执行。
&&&&&&&&&&&&limit_req&zone=allips&burst=5&
&&&&&&&&&&&&...
&&&&&&&&...
HttpLimitZoneModule 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
&&&&#定义一个名为one的limit_zone,大小10M内存来存储session,
&&&&#以$binary_remote_addr&为key
&&&&#nginx&1.18以后用limit_conn_zone替换了limit_conn
&&&&#且只能放在http作用域
&&&&limit_conn_zone
&one &$binary_remote_addr &10m;&
&&&&server{
&&&&&&&&...
&&&&&&&&location&{
&&&&&&&&&&&&...
&&&&&&&&&&&limit_conn&one&20;
&#连接数限制
&&&&&&&&&&&#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
&&&&&&&&&&&limit_rate&500k;
&&&&&&&&&&&&...
&&&&&&&&...
nginx白名单设置
以上配置会对所有的ip都进行限制,有些时候我们不希望对搜索引擎的蜘蛛或者自己测试ip进行限制,
对于特定的白名单ip我们可以借助geo指令实现。
&&&&&geo&$limited{
&&&&&&&&default&1;
&&&&&&&&#google&
&&&&&&&&64.233.160.0/19&0;
&&&&&&&&65.52.0.0/14&0;
&&&&&&&&66.102.0.0/20&0;
&&&&&&&&66.249.64.0/19&0;
&&&&&&&&72.14.192.0/18&0;
&&&&&&&&74.125.0.0/16&0;
&&&&&&&&209.85.128.0/17&0;
&&&&&&&&216.239.32.0/19&0;
&&&&&&&&#M$
&&&&&&&&64.4.0.0/18&0;
&&&&&&&&157.60.0.0/16&0;
&&&&&&&&157.54.0.0/15&0;
&&&&&&&&157.56.0.0/14&0;
&&&&&&&&207.46.0.0/16&0;
&&&&&&&&207.68.192.0/20&0;
&&&&&&&&207.68.128.0/18&0;
&&&&&&&&#yahoo
&&&&&&&&8.12.144.0/24&0;
&&&&&&&&66.196.64.0/18&0;
&&&&&&&&66.228.160.0/19&0;
&&&&&&&&67.195.0.0/16&0;
&&&&&&&&74.6.0.0/16&0;
&&&&&&&&68.142.192.0/18&0;
&&&&&&&&72.30.0.0/16&0;
&&&&&&&&209.191.64.0/18&0;
&&&&&&&&#My&IPs
&&&&&&&&127.0.0.1/32&0;
&&&&&&&&123.456.0.0/28&0;&#example&for&your&server&CIDR
geo指令定义了一个白名单$limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0
2.使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip,这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问
map $limited $limit {
1 $binary_remote_
3.设置limit_req_zone和limit_req
limit_req_zone $limit zone=foo:1m rate=10r/m;
limit_req zone=foo burst=5;
最后我们使用压的方式,对上面的方法效果实际测试下
例1:限制只允许一分钟内只允许一个ip访问60次配置,也就是平均每秒1次
首先我们准备一个php脚本放在根目录下$document_root
for( $i=0; $i
nginx配置增加limit_req_zone 和 limit_req
&&&&limit_req_zone&$binary_remote_addr&zone=allips:10m&rate=60r/m;
&&&&server{
&&&&&&&&...
&&&&&&&&location&{
&&&&&&&&&&&&...
&&&&&&&&&&&&limit_req&zone=
&&&&&&&&&&&&...
&&&&&&&&...
ab -n 5 -c 1 http://www.weizhang.org/test.php
118.144.94.193 - - [22/Dec/:06 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:06 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
未设置brust和nodelay可以看到该配置只允许每秒访问1次,超出的请求返回503错误
&&&&limit_req_zone&$binary_remote_addr&zone=allips:10m&rate=60r/m;
&&&&server{
&&&&&&&&...
&&&&&&&&location&{
&&&&&&&&&&&&...
&&&&&&&&&&&&limit_req&zone=allips&burst=1&
&&&&&&&&&&&&...
&&&&&&&&...
ab -n 5 -c 1 http://www.weizhang.org/test.php
118.144.94.193 - - [22/Dec/:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
设置brust=1和nodelay后允许第1秒处理两个请求。
除非注明,本站文章均为: 原创,转载请注明本文地址:
- 267,259 views - 203,819 views - 159,426 views - 125,773 views - 85,285 views - 81,387 views - 74,863 views - 73,393 views - 64,630 views - 53,916 views

我要回帖

更多关于 nginx 限制ip访问 的文章

 

随机推荐