使用nginx进行UDP转发

我有一个主要的系统日志服务器,从几个来源接收系统日志,我想发送这些日志到一个Graylog群集。 为了帮助群集跟上(在一些慢的虚拟机上),我需要能够将消息负载均衡到Graylog,因为有时它们会从端点进入大块(有些每10秒发送5k个日志)。

我试图使用nginx作为系统日志消息的负载平衡器,但我似乎无法得到它的工作,这似乎是因为nginx正在寻找来自Graylog服务器的响应。 使用UDP,它不会得到回应。 至less这是我认为正在发生的事情。

我得到的错误是这样的:

2016/12/01 11:27:59 [error] 2816#2816: *210325 no live upstreams while connecting to upstream, udp client: 10.0.1.1, server: 0.0.0.0:11016, upstream: "juniper_close_stream_backend", bytes from/to client:932/0, bytes from/to upstream:0/0 

作为我的nginx.conf中这个规则的一个例子,它看起来像:

 stream { server { listen 11016 udp; proxy_pass juniper_close_stream_backend; } upstream juniper_close_stream_backend { server 10.0.1.2:11016; server 10.0.1.3:11016; server 10.0.1.4:11016; } } 

在这个例子中,我的系统日志框是10.0.1.1,我的下游Graylog框是10.0.1。[2-4]。 我看到所有这些错误消息。

任何线索发生了什么? 当我在Graylog框上运行tcpdump时,我看到来自负载平衡器的stream量,这意味着它正在工作。 但我认为nginx正在期待一个回应,并给我一个错误。

所以这似乎是解决方案(在我上面的说明)。

如果从上面使用我的例子,你想这看起来像:

  stream { server { listen 11016 udp; proxy_pass juniper_close_stream_backend; proxy_responses: 0; } } 

这告诉nginx不要期待一个响应,它不应该需要从UDP。 我不知道为什么他们的例子在讨论DNS时没有显示出来,这可以完全由UDP驱动。