elk统计nginx访问流量 反代为什么入流量远大于出流量

1756人阅读
服务器维护
利用Ngnix将线上流量拷贝到测试机(一个http请求视为一份流量)
开发环境:CentOS 6.4
nginx安装目录:/usr/local/nginx-1.4.2
各模块安装包下载目录:/data/nginxinstall
本方法的局限性:模拟的多线程需要都返回时,才返回最终结果,因此测试线程延迟会影响线上。
1. 安装pcre
&#yum -y install pcre pcre-devel
2. 安装zlib
yum -y install zlib zlib-devel
3. 安装LuaJIT
# cd /data/nginxinstall
# wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
# tar -xzvf LuaJIT-2.0.2.tar.gz
# cd LuaJIT-2.0.2
lib和include是直接放在/usr/local/lib和usr/local/include
配置环境变量
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
4. 下载准备httpLuaModule
# cd /data/nginxinstall
# wget /chaoslawful/lua-nginx-module/archive/v0.8.6.tar.gz
# tar -xzvf v0.8.6
5. 下面开始安装Nginx(尝试采用nginx1.10.0遇到编译有错误):
# cd /data/nginxinstall/
# wget http://nginx.org/download/nginx-1.4.2.tar.gz&
# tar -xzvf nginx-1.4.2.tar.gz
# cd nginx-1.4.2
# ./configure --prefix=/usr/local/nginx-1.4.2 --add-module=../lua-nginx-module-0.8.6
# make -j2
# make install
6. 编辑nginx/conf/nginx.conf文件(本文件是一个json格式,可以看做一棵树):
在http结点下添加:
& & upstream online {
& & & & &server &10.10.12.7:80;
& & upstream test {
& & & & &server &10.10.10.103:80;
在server结点下添加
location ~* ^/antispam {
& & client_body_buffer_size 2m;
& & set $svr & & &on&; & & & & & & & #开启或关闭copy功能
& & content_by_lua_file & copy_flow.
location ~* ^/online {
& & &rewrite ^/s1(.*)$ $1
& & &proxy_pass http://s1; -- 反向代理,跳转到upstream online
location ~* ^/test {
& & rewrite ^/test(.*)$ $1
& & proxy_pass http:// -- 反向代理,跳转到upstream test
7. 编辑nginx/copy_flow.lua 文件:
local online, test, action
action = ngx.var.request_method
if action == &POST& then
& & ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
& & local arg = ngx.req.get_post_args() -- post需要参数传递
& & arry = {method = ngx.HTTP_POST, body = ngx.var.request_body, args=arg}
& & arry = {method = ngx.HTTP_GET}
if ngx.var.svr == &on& then
online, test = ngx.location.capture_multi {
& &{ &/online& .. ngx.var.request_uri, arry},
& &{ &/test& .. ngx.var.request_uri, arry},
& & online = ngx.location.capture_multi {
& & & &{ &/online& .. ngx.var.request_uri, arry}
if online.status == ngx.HTTP_OK then -- 只返回online server的结果
ngx.say(online.body)
ngx.status = ngx.HTTP_NOT_FOUND
8. POST参数中有中文,编码问题:
Nginx配置UTF8 : 在server节点下配置 charset utf-8;
tomcat配置URL编码格式: &Connector port=&8080& &protocol=&HTTP/1.1& connectionTimeout=&20000& redirectPort=&8443& URIEncoding=&UTF-8& /&
9. test 出现延迟,从而Lua模拟出的线程出现延迟,影响线上, 需要添加如下参数:
location ~* ^/test {
& proxy_connect_timeout 100
& proxy_read_timeout & &100
& proxy_send_timeout & &100
& proxy_pass http://
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2345次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'DDOS是一种通过大流量的请求对目标进行轰炸式访问,导致提供服务的服务器资源耗尽进而无法继续提供服务的攻击手段。一般情况下,攻击者通过大量请求与连接使服务器处于饱和状态,以至于无法接受新的请求或变得很慢。应用层DDOS攻击的特征应用层(七层/HTTP层)DDOS攻击通常由木马程序发起,其可以通过设计更好的利用目标系统的脆弱点。例如,对于无法处理大量并发请求的系统,仅仅通过建立大量的连接,并周期性的发出少量数据包来保持会话就可以耗尽系统的资源,使其无法接受新的连接请求达到DDOS的目的。其他还有采用发送大量连接请求发送大数据包的请求进行攻击的形式。因为攻击是由木马程序发起,攻击者可以在很短时间内快速建立大量的连接,并发出大量的请求。以下是一些DDOS的特证,我们可以据此特征来抵抗DDOS(包括但不限于):攻击经常来源于一些相对固定的IP或IP段,每个IP都有远大于真实用户的连接数和请求数。备注:这并不表明这种请求都是代表着DDOS攻击。在很多使用NAT的网络架构中,很多的客户端使用网关的IP地址访问公网资源。但是,即便如此,这样的请求数和连接数也会远少于DDOS攻击。因为攻击是由木马发出且目的是使服务器超负荷,请求的频率会远远超过正常人的请求。User-Agent通常是一个非标准的值Referer有时是一个容易联想到攻击的值使用Nginx、Nginx Plus抵抗DDOS攻击结合上面提到的DDOS攻击的特征,Nginx、Nginx Plus有很多的特性可以用来有效的防御DDOS攻击,可以从调整入口访问流量和控制反向代理到后端服务器的流量两个方面来达到抵御DDOS攻击的目的。限制请求速度设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;server {...location /login.html {limit_req zone=...}}`limit_req_zone`命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的`limit_req`通过引用one共享内存区来实现限制访问/login.html的目的。限制连接数量设置Nginx、Nginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。limit_conn_zone $binary_remote_addr zone=addr:10m;server {...location /store/ {limit_conn addr 10;...}}`limit_conn_zone`命令设置了一个叫addr的共享内存区来存储特定键值的状态,在上面的例子中是客户端IP( $binary_remote_addr)。location块中`limit_conn`通过引用addr共享内存区来限制到/store/的最大连接数为10。关闭慢连接有一些DDOS攻击,比如Slowlris,是通过建立大量的连接并周期性的发送一些数据包保持会话来达到攻击目的,这种周期通常会低于正常的请求。这种情况我们可以通过关闭慢连接来抵御攻击。`client_body_timeout`命令用来定义读取客户端请求的超时时间,`client_header_timeout`命令用来定于读取客户端请求头的超时时间。这两个参数的默认值都是60s,我们可以通过下面的命令将他们设置为5s:server {client_body_timeout 5s;client_header_timeout 5s;...}设置IP黑名单如果确定攻击来源于某些IP地址,我们可以将其加入黑名单,Nginx就不会再接受他们的请求。比如,你已经确定攻击来自于从123.123.123.1到123.123.123.16的一段IP地址,你可以这样设置:location / {deny 123.123.123.0/28;...}或者你确定攻击来源于123.123.123.3、123.123.123.5、123.123.123.7几个IP,可以这样设置:location / {deny 123.123.123.3;deny 123.123.123.5;deny 123.123.123.7;...}设置IP白名单如果你的网站仅允许特定的IP或IP段访问,你可以结合使用allow和deny命令来限制仅允许你指定的IP地址访问你的网站。如下,你可以设置仅允许192.168.1.0段的内网用户访问:location / {allow 192.168.1.0/24;...}deny命令会拒绝除了allow指定的IP段之外的所有其他IP的访问请求。使用缓存进行流量削峰通过打开Nginx的缓存功能并设置特定的缓存参数,可以削减来自攻击的流量,同时也可以减轻对后端服务器的请求压力。以下是一些有用的设置:`proxy_cache_use_stale `的updating参数告诉Nginx什么时候该更新所缓存的对象。只需要到后端的一个更新请求,在缓存有效期间客户端对该对象的请求都无需访问后端服务器。当通过对一个文件的频繁请求来实施攻击时,缓存功能可极大的降低到后端服务器的请求。`proxy_cache_key `命令定义的键值通常包含一些内嵌的变量(默认的键值$scheme$proxy_host$request_uri包含了三个变量)。如果键值包含`$query_string`变量,当攻击的请求字符串是随机的时候就会给Nginx代理过重的缓存负担,因此我们建议一般情况下不要包含`$query_string`变量。屏蔽特定的请求可以设置Nginx、Nginx Plus屏蔽一些类型的请求:针对特定URL的请求针对不是常见的User-Agent的请求针对Referer头中包含可以联想到攻击的值的请求针对其他请求头中包含可以联想到攻击的值的请求比如,如果你判定攻击是针对一个特定的URL:/foo.php,我们就可以屏蔽到这个页面的请求:location /foo.php {}或者你判定攻击请求的User-Agent中包含foo或bar,我们也可以屏蔽这些请求:location / {if ($http_user_agent ~* foo|bar) {return 403;}...}http_name变量引用一个请求头,上述例子中是User-Agent头。可以针对其他的http头使用类似的方法来识别攻击。限制到后端服务器的连接数一个Nginx、Nginx Plus实例可以处理比后端服务器多的多的并发请求。在Nginx Plus中,你可以限制到每一个后端服务器的连接数,比如可以设置Nginx Plus与website upstream中的每个后端服务器建立的连接数不得超过200个:upstream website {server 192.168.100.1:80 max_conns=200;server 192.168.100.2:80 max_conns=200;queue 10 timeout=30s;}`max_conns`参数可以针对每一个后端服务器设置Nginx Plus可以与之建立的最大连接数。`queue`命令设置了当每个后端服务器都达到最大连接数后的队列大小,`timeout`参数指定了请求在队列中的保留时间。处理特定类型的攻击有一种攻击是发送包含特别大的值的请求头,引起服务器端缓冲区溢出。Nginx、Nginx Plus针对这种攻击类型的防御,可以参考[Using NGINX and NGINX Plus to Protect Against CVE-](/blog/nginx-protect-cve-/?_ga=1.9284699)优化Nginx性能DDOS攻击通常会带来高的负载压力,可以通过一些调优参数,提高Nginx、Nginx Plus处理性能,硬抗DDOS攻击,详细参考:[Tuning NGINX for Performance](/blog/tuning-nginx/?_ga=1.9284699)识别DDOS攻击到目前为止,我们都是集中在如何是用Nginx、Nginx Plus来减轻DDOS攻击带来的影响。如何才能让Nginx、Nginx Plus帮助我们识别DDOS攻击呢?`Nginx Plus Status module`提供了到后端服务器流量的详细统计,可以用来识别异常的流量。Nginx Plus提供一个当前服务状态的仪表盘页面,同时也可以在自定义系统或其他第三方系统中通过API的方式获取这些统计信息,并根据历史趋势分析识别非正常的流量进而发出告警。总结Nginx和Nginx Plus可以作为抵御DDOS攻击的一个有力手段,而且Nginx Plus中提供了一些附加的特性来更好的抵御DDOS攻击并且当攻击发生时及时的识别到。原文:/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/译文:/content/15/615.shtml译者:陈洋 (运维帮)
本文已收录于以下专栏:
相关文章推荐
自家的APP上线已经有一段时间了,突然有一天发现线上产品居然不能发送验证码。
登录第三方短信验证码服务后台,发现问题很严重。
防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈。DDOS的特点是分布式,针对带宽和服务攻击,也就 是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架...
服务器刚托管到机房,三天两头出问题,100M的带宽居然也用完了,以下是我转自别人的文章,做个记录
Nginx下防御HTTP GET FLOOD(CC)攻击
Nginx是一款轻量级的Web服务器,由...
时不时的就有客户会被DDoS一下。很多时候攻击很简单也容易封堵,但是攻击的目标是应用的时候就更难防御。在这里云端卫士介绍一下使用Nginx作为代理过滤器来封堵一些这种攻击。
Apache D...
1,nginx内置变量nginx 有很多内置变量可以进行简单的过滤。
请求行中的name参数。
请求行中参数字符串。
$cookie_name
名为name的cooki...
nginx 屏蔽指定URI
大多数服务器被恶意刷量,集中在个别接口,当服务器扛不住时可以暂时屏蔽被刷接口,或者根据指定querystring屏蔽请求
比如有个播放接口 ...
最近,报告查询系统负载均衡集群相关配置已经完成,两种实现方式分别是基于Ehcache和Redis的session管理策略。
大家都知道服务器资源有限的,但是客户端来的请求是无限的(不排除...
1. ngx_http_limit_conn_module 可以用来限制单个IP的连接数:
ngx_http_limit_conn_module 模块可以按照定义的键限定每个键值的连接数。特别的...
网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)分类:服务器配置 标签:nginx 360网站卫士 CDN 10,216 views人浏览
网站被攻击是一个永恒不变的话...
大家好,我们是OpenCDN团队的Twwy。这次我们来讲讲如何通过简单的配置文件来实现nginx防御攻击的效果。
其实很多时候,各种防攻击的思路我们都明白,比如限制IP啊,过滤攻击...
他的最新文章
讲师:AI100
讲师:谢梁
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)9117人阅读
linux(5)
本文来源于实验楼linux web运维(nginx)实战课程,原文链接:/courses/95,
对其进行总结回顾,如有侵权,私信删除。
1.什么是nginx
nginx是一款高性能的HTTP和反向代理服务器软件,下图是w3techs公布的全球网站服务器软件统计报告
2.为什么选择nginx
Nginx 和 Apache 相同点:
同是HTTP服务器软件,都采用模块化结构设计支持通用语言接口,如PHP,Python等支持正向代理和反向代理支持虚拟主机及ssl加密传输支持缓存及压缩传输支持URL重写模块多,扩展性强多平台支持
Nginx的优势
轻量级 安装文件小 运行时CPU内存使用率低性能强 支持多核,处理静态文件效率高,内核采用的poll模型最大可以支持50K并发连接支持热部署 同时启动速度快,可以在不间断服务的情况下对软件和配置进行升级负载均衡 支持容错和健康检查代理功能强大 支持无缓存的反向代理,同时支持IMAP/POP3/SMTP的代理
3.工作原理
Nginx由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx的各种功能和操作都由模块来实现。Nginx的模块从结构上分为核心模块、基础模块和第三方模块。
核心模块: HTTP模块、EVENT模块和MAIL模块基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块第三方模块: HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用户自己开发的模块
这样的设计使Nginx方便开发和扩展,也正因此才使得Nginx功能如此强大。Nginx的模块默认编译进nginx中,如果需要增加或删除模块,需要重新编译Nginx,这一点不如Apache的动态加载模块方便。如果有需要动态加载模块,可以使用由淘宝网发起的web服务器Tengine,在nginx的基础上增加了很多高级特性,完全兼容Nginx,已被国内很多网站采用。
4.nginx 处理连接过程
& nginx 不会为每个连接派生进程或线程,而是由 worker 进程通过监听共享套接字接受新请求,并且使用高效的循环来处理数千个连接。Nginx 不使用仲裁器或分发器来分发连接,这个工作由操作系统内核机制完成。监听套接字在启动时就完成初始化,worker 进程通过这些套接字接受、读取请求和输出响应。
当 nginx 在启动后,会有一个 master 进程和多个 worker 进程。master进程主要用来管理worker进程,master 要做的就是:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker
主要完成如下工作:
读取并验证配置信息;创建、绑定及关闭套接字;启动、终止 worker 进程及维护 worker 进程的个数;无须中止服务而重新配置工作;控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;重新打开日志文件;编译嵌入式 perl 脚本
对于基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求(一对一)。然而 nginx 没有专门地仲裁或连接分布的 worker,这项工作是由操作系统内核机制完成的。在启动时,创建一组初始的监听套接字,HTTP 请求和响应之时,worker 连续接收、读取和写入套接字。
worker 进程主要完成的任务包括:
接收、传入并处理来自客户端的连接;提供反向代理及过滤功能;nginx 任何能完成的其它任务
举例说明一个完整请求如何通过互相协作来实现的
既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http 服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有
worker 进程会在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,然后在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。
也许你还有个疑问,那就是 nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?然而,这就是 nginx 的高明之处,nginx 采用了异步非阻塞的方式来处理请求,也就是说,nginx 是可以同时处理成千上万个请求的。
异步非阻塞
异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。
5.nginx 的优化
tcp_nodelay 配置 nginx 不要缓存数据,应该快速的发送小数据——这仅仅应该用于频繁发送小的碎片信息而无需立刻获取响应的、需要实时传递数据的应用中。
keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。
2、logging setings
access_log 确定了 nginx 是否保存访问日志。将这个设置为关闭可以降低磁盘 IO 而提升速度。
error_log 设置 nginx 应当记录临界错误。
修改好配置文件以后,务必记得使用:
sudo service nginx reload
来使配置文件生效。
6.流量及并发连接数限制
1)指令使用及配置修改
我们需要在 http 的 server 中加一个 location,就好比之前我们做的简单的 echo 模块,格式为:
location /刚下好的测试文件夹/ {
root /刚才下载测试文件的目录/;
接下来就是调用命令实现流量限制。nginx 的模块中早就写好了对应的命令,我们只需要调用就好。
实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成:
limit_rate
语法: limit_
默认值: limit_rate 0;
作用域: http, server, location, if in location
命令概述:限制向客户端传送响应的速率限制。参数 rate 的单位是字节/秒,设置为 0 将关闭限速。 nginx 按连接限速,所以如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的 2 倍。
limit_rate_after
语法: limit_rate_
默认值: limit_rate_after 0;
作用域:http, server, location, if in location
设置不限速传输的响应大小。当传输量大于此值时,超出部分将限速传送。
作用范围:http,server,location,if inlocation
要是想了解更多,这里有更加详细的命令信息
讲了要使用的指令 我们接下来就实战配置
这是小编实验时的配置(传输量限制为 3m,速率限制为 20k/s):
(2)配置之前与配置之后的测试
接下来就是测试
wgethttp://本机地址/seven/seven.mp4
本机地址用 ifconfig 来查看
修改配置之前,速率没有限制:
修改配置之后,可见由于传输量大于 3m,超出部分的传输速率已经被限制在 20k/s:
也许你已经发现配置之后刚开始的时候传输速度很高,因为,传输量大于设定值的部分才会受到限制。这就说明,我们两个命令都发挥了作用,这也就完成了我们第一个实战。
2.实现并发连接数限制的具体配置
(1)指令使用及配置文件修改
这个的配置是基于 ngx_http_limit_zone_module 模块的,要简单完成并发限制,我们要涉及到 limit_conn_zone 和 limit_conn 这两个指令:
limit_conn_zone
语法: limit_conn_zone zone_name $variable the_size
默认值: no
作用域: http
本指令定义了一个数据区,里面记录会话状态信息。 variable 定义判断会话的变量;the_size 定义记录区的总容量。
limit_conn
语法: limit_conn zone_name the_size
默认值: no
作用域: http, server, location
指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 &Service unavailable& (503)。
配置示例:
limit_conn_zone
$binary_remote_addr
zone=one:10m;
location /seven/ {
limit_conn
定义一个叫“one”的记录区,总容量为 10M,以变量 $binary_remote_addr 作为会话的判断基准(即一个地址一个会话)。 限制 /seven/ 目录下,一个会话只能进行一个连接。 简单点,就是限制 /seven/ 目录下,一个 IP 只能发起一个连接,多过一个,一律 503。
你可以注意到了,在这里使用的是$binary_remote_addr 而不是 $remote_addr。$remote_addr 的长度为 7 至 15 bytes,会话信息的长度为 32 或 64 bytes。 而 $binary_remote_addr 的长度为 4 bytes,会话信息的长度为 32 bytes。 当 zone 的大小为 1M 的时候,大约可以记录 32000 个会话信息(一个会话占用
32 bytes)。
由于环境的原因这里没有办法测试只是让大家了解,限制并发连接数 nginx 的对应模块的配置,如果大家有需要,可以进一步参照&这里有更详细的讲解。
7.访问控制及 DDOS 预防
1.访问控制配置
基于各种原因,我们要进行访问控制。比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的 IP 访问。访问控制就是指只有符合条件的 IP 才能访问到这个网站的某个区域。
涉及模块:ngx_http_access_module
模块概述:允许限制某些 IP 地址的客户端访问。
对应指令:
语法: allow address | CIDR | unix: |
默认值: —
作用域: http, server, location, limit_except
允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
语法: deny address | CIDR | unix: |
默认值: —
作用域: http, server, location, limit_except
禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。
配置范例:
location / {
deny192.168.1.1;
allow192.168.1.0/24;
allow10.1.1.0/16;
allow2001:0db8::/32;
规则按照顺序依次检测,直到匹配到第一条规则。 在这个例子里,IPv4 的网络中只有 10.1.1.0/16 和 192.168.1.0/24 允许访问,但 192.168.1.1 除外;对于 IPv6 的网络,只有 ::/32 允许访问。
ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。这个模块大家下来可以了解 :&
2.DDOS 预防配置
DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。
ngx_http_limit_conn_module 可以限制单个 IP 的连接数
ngx_http_limit_req_module 可以限制单个 IP 每秒请求数
配置方法:
(1). 限制每秒请求数
涉及模块:ngx_http_limit_req_module
通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。
配置范例:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
~ \.php$ {
limit_req zone=one burst=5
必要配置说明(上一部分解释过的就不再解释):
$binary_remote_addr 二进制远程地址
rate=10r/s; 限制频率为每秒 10 个请求
burst=5 允许超过频率限制的请求数不多于 5 个,假设 1、2、3、4 秒请求为每秒 9 个,那么第 5 秒内请求 15 个是允许的;反之,如果第一秒内请求 15 个,会将 5 个请求放到第二秒,第二秒内超过 10 的请求直接 503,类似多秒内平均速率限制。
nodelay 超过的请求不被延迟处理,设置后 5(不延时)+10(延时)个请求在 1 秒内处理。(这只是理论数据,最多的情况)
(2).限制 IP 连接数
上一章讲过,我们就直接写出来
limit_conn_zone $binary_remote_addr zone=addr:10m; //上面讲过
location /操作目录/ {
limit_conn addr 1;
(3).白名单设置
http_limit_conn 和 http_limit_req 模块限制了单 IP 单位时间内的连接和请求数,但是如果 Nginx 前面有 lvs 或者 haproxy 之类的负载均衡或者反向代理,nginx 获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单:
geo $whiteiplist
default 1;
10.11.15.1610;
map $whiteiplist$limit {
1$binary_remote_addr;
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;
geo 模块定义了一个默认值是 1 的变量 whiteiplist,当在 ip 在白名单中,变量 whiteiplist 的值为 0,反之为 1
下面是设置的逻辑关系解释:
如果在白名单中--& whiteiplist=0 --& $limit=&& --& 不会存储到 10m 的会话状态(one 或者 addr)中 --& 不受限制;
反之,不在白名单中 --& whiteiplist=1 --& $limit=二进制远程地址 --&存储进 10m 的会话状态中 --& 受到限制。
3.动手测试 DDOS 预防配置
下面我们就来测一下刚刚的配置是否起到了作用。
1.安装所有测试所需的软件(源码安装 nginx,apt 安装 php5-fpm,apt 安装 apach-u) 为了便于修改配置文件,这里选择源码安装 nginx:
wget http://labfile./nginx-1.7.9.tar.gz
接下来编译安装。
sudo apt-get install apache2-utils
sudo apt-get install php5-fpm
安装好以后 分别启动 php5 和 nginx。
2.写一个测试的 php 文件,修改 nginx 配置文件,使其能正常访问。
在/home/shiyanlou 目录下写一个 test.php,内容如下:
nginx 配置文件修改:
最后展示:
3.使用命令 ab 测试,修改配置文件前后(连接数和请求数分开测试)。
什么都没修改之前:
测试条件:
测试结果:
修改了配置文件图(记得重启 nginx)测试条件也要一样:
最后测试结果图:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13162次
排名:千里之外
原创:11篇
(1)(1)(1)(1)(2)(2)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 nginx 流量统计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信