Kafka记录Nginx的POST请求
最近因为工作原因,需要将Nignx的POST请求数据实时采集到Kafka中。最容易的想到的方案就是通过"tail -f" Nginx的log日志到Kafka的Broker集群中,但是这种方案效率、吞吐量都很低,完全无法满足业务上的需要。所以如果能直接在Nginx中获取到POST请求数据,并调用Kafka的API接口将数据直接写入到Kafka集群中,是最完美的解决方法了。但是此种方案存在一个难点啊,就是要写一个Nginx模块,由于刚开始接触Nginx,这块不是很熟。只能借助万能Google了,输入关键字“Nginx Kafka”,没想到还真找到一个开源的Nginx模块(ngx_kafka_module),心中万分高兴,本来以为拿来就能用呢,通读代码才发现,它只能将POST请求发给一个Broker,不能借助Zookeeper的集群管理功能,让zookeeper自动帮助选一个Broker。没有办法了,只能自己动手修改一下了。首先从了解编写Nginx模块的步骤入手,找到淘宝开源的"Nginx开发从入门到精通"电子书,这里要赞一下,果然是对Nginx有深入了解,要不也不能写出这么深入浅出的书。在了解了编写步骤后,开始对ngx_kafka_module着手进行改造,在ngx_kafka_module里增加了一个“kafka.broker.list”的main配置项和一个全局变量(g_broker_list)用于记录nginx.conf配置文件中kafka.broker.list的值,并在该模块初始化时,用此全局变量设置kafka_conf的“metadata.broker.list”属性,然后用此kafka_conf初始化一个生产者。这样当每来一个POST请求时,就是可通过此生产者将POST消息发送到相应的topic。
Kafka记录Nginx的POST请求的更多相关文章
- nginx记录响应与POST请求日志
生产环境中的某些api出现故障,但是问题无法重现,但是又很想解决掉问题以及我们新项目上线,需要跟踪请求与响应的信息,可以预先找到一些bug,减少大面积的损失. 安装nginx与ngx_lua 响应日志 ...
- 【Nginx】HTTP请求的11个处理阶段
Nginx将一个HTTP请求分成多个阶段.以模块为单位进行处理.这样做的优点是使处理过程更加灵活.减少耦合度.HTTP框架将处理分成了11个阶段,各个阶段能够包括随意多个HTTP模块并以流水线的方式处 ...
- 万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段
Nginx 处理一个 HTTP 请求的全过程 前面给大家讲了 Nginx 是如何处理 HTTP请求头部的,接下来就到了真正处理 HTTP 请求的阶段了.先看下面这张图,这张图是 Nginx 处理 HT ...
- Nginx如何处理一个请求
看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...
- Apache与Nginx对客户端请求的处理机制对比
Apache与Nginx对客户端请求的处理机制对比 模块 大致为四个模块,核心模块.HTTP模块.邮件模块,以及第三方模块 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理,错误 ...
- [转载]Nginx如何处理一个请求
http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...
- Nginx配置TCP请求转发
Nginx配置TCP请求转发 1.TCP请求转发基于stream在1.9版本前,需要单独编译安装该组建: # 依赖服务 [root@baolin conf]#yum -y install pcre-d ...
- nginx学习笔记(7)Nginx如何处理一个请求---转载
如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...
- Nginx记录-Nginx介绍
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 ...
随机推荐
- linux移动复制删除命令
用mv命令1.作用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中.该命令等同于DOS系统下的ren和move命令的组合.它的使用权限是所有用户.2.格式mv [options] 源文件或 ...
- RowToColumn
SELECT S.NAME, sum(decode(S.COURSE,'语文',S.SCORE,0))"语文", sum(decode(S.COURSE,'数学',S.SCORE, ...
- node实现缓存
内容: 1.缓存基本原理 2.node实现缓存 1.缓存基本原理 第一重要.缓存策略: cache-control:用于控制缓存,常见的取值有private.no-cache.max-age.must ...
- 20180129周一之学习PYTHON笔记【安装、查看工作目录、】
一,安装过程中多选一个ADD的项,免去设置环境变量. 二,PYAUTOGUI模块控制键鼠. IMAGE模块. ----------------------python 如何查看与更换工作目录----- ...
- 18. 进livebos对象直接跳转jsp页面的做法
在网格脚本定义添加: window.onload=function(){ window.location.href='/plug-in/sinopec/contractManagement/h ...
- leetcode455
public class Solution { public int FindContentChildren(int[] g, int[] s) { var listg = g.OrderBy(x = ...
- [PHP]用户登陆中间件
Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里 ...
- ABAP-SET UPDATE TASK LOCAL
SET UPDATE TASK LOCAL 影响 切换本地更新任务.这意味着当您指定 CALL FUNCTION ... IN UPDATE TASK时,更新数据不会存储在数据库中,而是存储在ABA ...
- 通过maven 上传jar 到nexus3,cong nexus3下载jar
nexus是一种常见的maven私服软件. 网上介绍的都是nexus2的使用,下面是最新版nexus3的使用方式. 首先需要从官网下载nexus3的包,很卡. 下载好以后解压会有两个文件夹:nexus ...
- oc 中的id类型与类型转换
id是oc语言中一个独特的数据类型.一种通用对象类型.可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象. 使用示例: Animal * dog = [[Dog alloc]init] ...