基于nginx对网站各二级域名实际流量统计的方法
技术领域
1.本发明涉及网络监控技术领域,具体地说,是一种基于nginx对网站各二级域名实际流量统计的方法,用于对网站各二级域名实际流量进行统计,并更清晰的展示nginx代理的各二级域名的流量信息。
背景技术:2.在现有的监控体系中,对服务器网卡流量已经有完善的应用案例,比如利用zabbix或者cacti等开源方案,可以很好监控服务器的流量。通过部署在网站代理端的nginx服务器上,可以实现对整个网站流入流出的流量监控,用以支撑网站健康状况的检查。另外在部署了nginx服务器上,大多数情况下会配置多个域名代理,在监控服务器整体流量的同时,为了能够更好的了解各个域名间的流量统计,以快速定位在nginx代理服务器上各域名站点的流量情况。
3.现有的监控方案可以获取nginx代理服务器中各站点域名的流量情况,但在可视化和历史数据呈现上支撑不足,尤其在代理的域名较多的情况下,对数据分析不能直观的体现。另外,由于从nginx获取的数据对历史数据展示并不能体现到具体时间段,所以不能有效展示某段时间内各站点域名的流量走势。为此,通过额外的程序加以辅助,定时通过程序记录获取到的各域名站点流量数据,并存储到数据库中,再通过前端页面渲染,将存储的数据加以处理,得到可视化的图形展示页面,这将极大的方便我们对nginx代理的各域名流量的分析以及流量异常时的问题定位,同时也通过数据可以在页面展示历史数据的走势。
技术实现要素:4.本发明的目的在于提供一种基于nginx对网站各二级域名实际流量统计的方法,通过获取nginx中域名的实时流量数据将数据可视化,以展示在nginx代理服务器上的各域名的流量情况,主要展示各域名的当前流量和历史流量,便于运维与开发人员的对站点流量的统计分析。
5.本发明通过下述技术方案实现:一种基于nginx对网站各二级域名实际流量统计的方法,包括以下步骤:
6.步骤s1.在nginx中重新编译nginx-module-vts模块,并在nginx中配置vts模块的访问api接口;
7.步骤s2.通过api接口获取实时流量数据,通过数据组装以字典形式存储数据;
8.步骤s3.将从api接口获取的实时数据进行累加后通过计算,划分为按分钟与按天的数据,并记录到数据库;
9.步骤s4.在前端页面字将节流量进行转换;
10.步骤s5.对前端各域名按不同时间维护的流量数据值进行排序。
11.为了更好地实现本发明,进一步地,所述步骤s1包括:
12.通过api接口查看监控数据。
13.为了更好地实现本发明,进一步地,所述步骤s2中存储数据的方式包括:
14.将域名与流量字节对应存储后,将多域名数据再组成多维字典。
15.为了更好地实现本发明,进一步地,所述步骤s3包括:
16.步骤s31.通过开发程序分别定时获取按分钟与按天的数据;
17.步骤s32.在定时每分钟运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一分钟历史值的队列中;
18.在定时每天运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一天历史值的队列中;
19.步骤s33.当定时运行的代码再次执行时,根据获取的当前流量值与队列中相应域名的值的做差值,以获得在一分钟内域名流量值和在一天内域名流量值,并记录到数据库中,获取按分钟和按天的统计数据。
20.为了更好地实现本发明,进一步地,所述步骤s4包括:
21.通过javascript的math函数将节流量的转换为gb单位、mb单位和kb单位。
22.为了更好地实现本发明,进一步地,所述步骤s5包括:
23.通过python字典按照value排序并取前十条数据用于前端页面图形渲染。
24.本发明与现有技术相比,具有以下优点及有益效果:
25.(1)本发明可以更清晰的展示nginx代理的各二级域名的流量信息;
26.(2)本发明对于多二级域名的网站,在对网站流量的优化和分析时,提供有效的数据支撑;
27.(3)本发明在遇到突发的大流量告警时,可以更快的定位到具体的由哪个二级域名引起。
附图说明
28.本发明结合下面附图和实施例做进一步说明,本发明所有构思创新应视为所公开内容和本发明保护范围。
29.图1为本发明提供的一种基于nginx对网站各二级域名实际流量统计的方法中数据获取的流程图。
30.图2为本发明提供的一种基于nginx对网站各二级域名实际流量统计的方法中数据展示的框架流程示意图。
31.图3为本发明提供的一种基于nginx对网站各二级域名实际流量统计的方法中监控数据展示图一。
32.图4为本发明提供的一种基于nginx对网站各二级域名实际流量统计的方法中监控数据展示图二。
具体实施方式
33.为了更清楚地说明本发明实施例的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,应当理解,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例,因此不应被看作是对保护范围的限定。基于本发明中的实施例,本领域普通技术工作人员在没有做出创造性劳动前提下所获得的所
有其他实施例,都属于本发明保护的范围。
34.本文所描述的方案,是对网站流量监控的一种延伸,在常规的服务器流量监控基础上,实现网站二级域名流量的细分数据统计,提供更多维度的流量数据分析。
35.nginx是高性能的http和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验。
36.实施例1:
37.本实施例的一种基于nginx对网站各二级域名实际流量统计的方法,如图1-图4所示,本技术通过获取nginx中域名的实时流量数据,通过获取到的数据重新组装分类储存,并将数据可视化,以展示在nginx代理服务器上的各域名的流量情况,主要展示各域名的当前流量和历史流量,便于运维与开发人员的对站点流量的统计分析。由于所获数据本身只展示当前的实时信息,不具备分时存储,所以需要对数据重新封装,以便于页面的展示。为了方便数据的存取和页面展示的可读性,本发明在实现过程中对数据存储的格式做了相应的结构优化,前端页面在处理流量字节(byte)时,通过相应的算法以适应流量单位的转换。
38.实施例2:
39.本实施例在实施例1的基础上做进一步优化,将nginx重新编译新增模块nginx-module-vts模块,并在nginx中配置vts的访问api,nginx-module-vts是nginx的监控模块,能够提供json格式的数据产出,nginx_vts_exporter依赖nginx-module-vts模块,安装此模块无需任何其他依赖,如果未安装过nginx,需要下载编译模块,编译配置,再下载官方的软件包并编译进vts模块,例如:./configure
‑‑
user=nginx
‑‑
group=nginx
‑‑
prefix=/usr/local/nginx
‑‑
with-http_sysguard_module
‑‑
add-module=nginx-module-vts;编译后再安装nginx。如果已经安装过nginx,需要重新编译需要:首先查看当前编译参数,可根据自己设定的执行安装路径进行查看,判断是否能找到nginx的安装包,如果找不到可以下载已经安装的nginx相同版本的安装包,如果找得到直接使用nginx的安装包查看当前编译参数。其次,在nginx编译时添加vts模块,下载最新可下载的版本并解压,现在软件包存放在/data/program下,因此编译时加入对应的nginx-module-vts,找到nginx源码存放路径重新编译,备份并替换现用的nginx可执行文件,nginx编译后,新的二进制文件会存放在objs目录下。最后进行nginx的配置,包括在nginx中配置vts的访问api。还包括:打开vhost过滤:vhost_traffic_status_filter_by_host on;开启此功能,在nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上。在不想统计流量的server区域禁用vhost_traffic_status。在nginx中配置vts模块的访问api,安装完vts模块后,通过api接口,比如nginx status接口进行监控数据的查看。
40.如图3-图4所示,在nginx中配置vts模块的访问api查看监控数据,在图3中,因为我们的监控数据展示图是使用不同颜色的曲线作区分的,即图3中的1-8为不同网站的数据监控,但是因为专利申请中附图的黑白要求,因此本实施例中以1-8的数字符号进行替代,即使不去区分曲线交叉,从图中的网站名称及其对应的监控数据展示,也可以看的清楚。比如图3中在2022年4月24日11点02分可以通过展示图看到网站:ywapi.ypzdw.com:229.03mb,其对应的流量为图4中的45.32gb,这就是在本发明中通过重新编译nginx-module-vts模块,并在nginx中配置vts模块的访问api查看监控数据后,进行监控展示数据
的效果图。
41.本实施例的其他部分与实施例1相同,故不再赘述。
42.实施例3:
43.本实施例在上述实施例1或2的基础上做进一步优化,在本实施例中,存储数据的方式包括:将域名与流量字节对应存储后,将多域名数据再组成多维字典。
44.在本实施例中,将多域名数据再组成多维字典的方法可以选用利用collections模块defaultdict方法的特性,利用外部函数来实现或利用元组来充当多维字典的key,即将多维key按照规则放入元组中,使用该元组作为字典的key并赋值,以达到多维key的效果。
45.第一种:利用collections模块defaultdict方法的特性,利用外部函数来实现,为:fromcollections import defaultdict
46.def site_struct():
47.return defaultdict(board_struct)
48.def board_struct():
49.return defaultdict(user_struct)
50.def user_struct():
51.return dict(pageviews=0,username=”,comments=0)
52.userdict=defaultdict(site_struct)
53.userdict['site']['board']['username']=1
[0054]
userdict['par']['chl']['username']='ceshi'
[0055]
print userdict['site']['board']['username']
[0056]
print userdict['par']['chl']['username']。
[0057]
第二种:利用元组来充当多维字典的key,即将多维key按照规则放入元组中,使用该元组作为字典的key并赋值,以达到多维key的效果,为:
[0058]
userdict[('site1','board1','username')]='tommy'。
[0059]
本实施例的其他部分与上述实施例1或2相同,故不再赘述。
[0060]
实施例4:
[0061]
本实施例在上述实施例1-3任一项的基础上做进一步优化,在本实施例中公开了:步骤s31.通过开发程序分别定时获取按分钟与按天的数据;步骤s32.在定时每分钟运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一分钟历史值的队列中;在定时每天运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一天历史值的队列中;步骤s33.当定时运行的代码再次执行时,根据获取的当前流量值与队列中相应域名的值的做差值,以获得在一分钟内域名流量值和在一天内域名流量值,并记录到数据库中,获取按分钟和按天的统计数据。
[0062]
如图1所示为数据获取的流程图,首先定时执行查询数据,判断是否存在当前数据,如果是,结束并获取数据,如果否,查询api数据,并查询上一次记录的数据值,与当前数据做差值,记录差值并入库,最后获取数据。
[0063]
通过开发程序分别定时获取按分钟与按天的数据,在定时每分钟运行的代码中,
将当前获取的域名与流量字节以字典的格式存储在数据库,并按键值对存放于redis中(即前一分钟历史值);当定时运行的代码再次执行时,根据获取的当前流量值与redis中相应域名的值的做差值(server_zone[currentbytes]-server_zone[lastbytes]),以获得在一分钟内域名流量值,并记录到数据库中。
[0064]
本实施例的其他部分与上述实施例1-3任一项相同,故不再赘述。
[0065]
实施例5:
[0066]
本实施例在上述实施例1-4任一项基础上做进一步优化,本实施例公开了通过javascript的math函数将节流量的转换为gb单位、mb单位和kb单位。
[0067]
为适应用户浏览,需要在前端页面字将节流量的转换为gb,mb,kb单位,通过javascript的math函数转换以提高精度;
[0068]
a:当数据大于math.pow(1024,3)时,单位为gb;
[0069]
取值(data/math.pow(1024,3)).tofixed(2)+"gb";
[0070]
b:当数据大于math.pow(1024,2)时,单位为mb;
[0071]
取值(data/math.pow(1024,2)).tofixed(2)+"mb";
[0072]
c:当数据大于1024时,单位为kb;
[0073]
取值(data/1024).tofixed(2)+"kb"。
[0074]
本实施例的其他部分与上述实施例1-4任一项相同,故不再赘述。
[0075]
实施例6:
[0076]
本实施例在上述实施例1-5任一项基础上做进一步优化,本实施例公开了:通过python字典按照value排序并取前十条数据用于前端页面图形渲染。
[0077]
为适应用户浏览,多域名数据在页面的展示比较混乱,需对前端各域名按不同时间维护的流量数据值进行排序。通过python字典按照value排序并取前10条数据(sorted(dict.items(),key=lambda x:x[1],reverse=true)[:10]),用于前端页面图形渲染。
[0078]
在本实施例中,通过python字典按照value排序可以使用以下三种方法:
[0079]
第一种:key使用lambda匿名函数取value进行排序;
[0080]
第二种:使用operator的itemgetter进行排序;
[0081]
第三种:key和value分装成元祖,再进行排序,字典按value排序内容扩展,保存为字典后,按字典的value值大小排序,这个才是本方法的难点,由于dict是无序的,所以只能用list去排序,把dict的key和value保存为tuplue对象,再对字典按value排序;
[0082]
本实施例可以选取三种方法中的任一方法通过python字典按照value排序并取前10条数据(sorted(dict.items(),key=lambda x:x[1],reverse=true)[:10]),用于前端页面图形渲染。
[0083]
本实施例的其他部分与上述实施例1-5任一项相同,故不再赘述。
[0084]
如图2所示,用户登录进网站二级域名流量分析页面,进行流量数据的展示,在可视化的流量数据展示中可以看到当天流量数据折线图展示、按天历史数据折线展现图和数据的排序。以小时为单位可以看到1小时图、3小时图、6小时图和12小时图。按天历史数据折线展现图可以看到历史30天图,数据的排序展现图可以看到各二级域名的数值排序,可以更清晰的展示nginx代理的各二级域名的流量信息。
[0085]
以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依
据本发明的技术实质对以上实施例所做的任何简单修改、等同变化,均落入本发明的保护范围之内。
技术特征:1.一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,包括以下步骤:步骤s1.在nginx中重新编译nginx-module-vts模块,并在nginx中配置vts模块的访问api接口;步骤s2.通过api接口获取实时流量数据,通过数据组装以字典形式存储数据;步骤s3.将从api接口获取的实时数据进行累加后通过计算,划分为按分钟与按天的数据,并记录到数据库;步骤s4.在前端页面字将节流量进行转换;步骤s5.对前端各域名按不同时间维护的流量数据值进行排序。2.根据权利要求1所述的一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,所述步骤s1包括:通过api接口查看监控数据。3.根据权利要求1所述的一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,所述步骤s2中存储数据的方式包括:将域名与流量字节对应存储后,将多域名数据再组成多维字典。4.根据权利要求1所述的一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,所述步骤s3包括:步骤s31.通过开发程序分别定时获取按分钟与按天的数据;步骤s32.在定时每分钟运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一分钟历史值的队列中;在定时每天运行的代码中,将当前获取的域名与流量字节按照字典形式的格式存储在数据库中,并按键值对存放于前一天历史值的队列中;步骤s33.当定时运行的代码再次执行时,根据获取的当前流量值与队列中相应域名的值的做差值,以获得在一分钟内域名流量值和在一天内域名流量值,并记录到数据库中,获取按分钟和按天的统计数据。5.根据权利要求1所述的一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,所述步骤s4包括:通过javascript的math函数将节流量的转换为gb单位、mb单位和kb单位。6.根据权利要求1所述的一种基于nginx对网站各二级域名实际流量统计的方法,其特征在于,所述步骤s5包括:通过python字典按照value排序并取前十条数据用于前端页面图形渲染。
技术总结本发明涉及网络监控技术领域,公开了一种基于Nginx对网站各二级域名实际流量统计的方法,包括:步骤S1.在Nginx中重新编译nginx-module-vts模块,并在Nginx中配置vts模块的访问api接口;步骤S2.通过api接口获取实时流量数据,通过数据组装以字典形式存储数据;步骤S3.将从api接口获取的实时数据进行累加后通过计算,划分为按分钟与按天的数据,并记录到数据库;步骤S4.在前端页面字将节流量进行转换;步骤S5.对前端各域名按不同时间维护的流量数据值进行排序。本发明用于更清晰的展示Nginx代理的各二级域名的流量信息。Nginx代理的各二级域名的流量信息。Nginx代理的各二级域名的流量信息。
技术研发人员:刘翼
受保护的技术使用者:药小鹿(成都)数字营销策划有限公司
技术研发日:2022.06.09
技术公布日:2022/11/1