zoukankan      html  css  js  c++  java
  • nginx自定义模块编写-实时统计模块--转载

    原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99-%E5%AE%9E%E6%97%B6%E7%BB%9F%E8%AE%A1%E6%A8%A1%E5%9D%97.html

    不是第一次写nginx的自定义模块了,之前有写过根据POST数据转发请求的模块(参见nginx自定义模块编写-根据post参数路由到不同服务器),不过上次写的是处理模块,而这次写的是过滤模块,还是有一些区别的。

    在正式开始前,先说一下写nginx自定义模块要注意的几个点:

    1. 上次的文章提到,在函数里用r-connection.log打印log会core,今天发现是ngx头文件和lua头文件引用顺序的问题,把ngx的头文件放在最前面即可解决
    2. nginx的一个字符串类型 ngx_str_t 有两个参数, len 和 data,这两个参数一定要一起使用,因为data的结尾,不一定是len的长度,这一点千万要注意
    3. 需要和cpp文件联合编译是,在ngx的编译参数里面加上–with-ld-opt=”-lstdc++”

    OK,废话不多说,开始正式说我这次写的统计模块吧

    需求背景呢,就是现在已经在nginx后面挂了很多服务器,需要用nginx来统计成功率,响应时间等等参数,在网上翻了半天,大部分居然是用access_log,然后用程序扫描$request_time来实现的,这对一个每秒几千次访问的服务器是不可忍受的,所以最终没办法,那就自己写一个呗~

    重新看了nginx自定义模块的开发文档,整个调用过程如下:

    1

    但是实在是没找到请求整个结束时的回调函数,最接近的也就是用filter模块了(即过滤模块),当然这样统计出来的请求时间,可能会比实际时间短一些。

    OK,定了要写那种模块后,我们来考虑一下具体的实现

    1. 为了性能最大话,上报使用UDP协议,并且不收取回包,socket创建之后不释放
    2. 既然涉及到网络上报,就需要设置上报ip,port,来源等参数
    3. 过滤模块有两个函数,分别是ngx_http_output_header_filter_pt和ngx_http_output_body_filter_pt
    4. 上报的字段应该包括,method,uri,request_time,http状态码,目标IP,等等

    UDP上报client这里,因为是用的公司的库,而且又很简单,这里就不细说了,大家看代码也会看到,我在里面用的是static变量来保证不析构:

    参数配置这里,因为上报库的要求,需要ip,port,来源,所以配置代码如下:

    对于是选择ngx_http_output_header_filter_pt还是ngx_http_output_body_filter_pt这里,我最终选择了ngx_http_output_header_filter_pt,虽然说计算请求时间上会有差别,但是因为ngx_http_output_body_filter_pt会进入多次,写起来更复杂些,所以就走简单的了~

    代码如下:

    对于上报字段这里,主要是ngx_http_request_t每个字段的意义搞了我很久时间,这里也不多解释了,直接贴代码,大家应该能直接看懂了

    OK,整个代码基本就是这样了

    惯例,下面又发现的新问题,纠结了我好久,现在还是没解决

    1. ngx_log_error在打印%u的时候,会导致进程退出,至今不知道为啥,解决方式就是打印成%d
    2. ngx_log_error在打印%f的时候,会打印成int,而且即使指定%.2f之类的,打印的结果也不对,不知为啥,解决方式就是把值*1000变成int

    最后,代码已经上传的googlecode
    https://vimercode.googlecode.com/svn/trunk/nginx_stat_report

  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4353113.html
Copyright © 2011-2022 走看看