2016-12-01 48 views
3

我有一個主要的系統日誌服務器,它接收來自多個源的系統日誌,並且我想將這些日誌發送到一個Graylog羣集。爲了幫助羣集跟上(在一些速度慢的虛擬機上),我需要能夠將消息負載均衡到Graylog,因爲它們有時來自端點的大塊(有些每10秒發送5k個日誌)。使用nginx進行UDP轉發

我試圖使用nginx作爲系統日誌消息的負載均衡器,但我似乎無法得到它的工作,這似乎是因爲nginx正在尋找來自Graylog服務器的響應。使用UDP,它不會得到迴應。至少這是我認爲正在發生的事情。

我得到的錯誤是這樣的:

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時,我看到來自負載平衡器的流量,這意味着它正在工作。但我認爲nginx正在等待迴應,並給我一個錯誤。

+0

我可能已經想通了一點。我設置了「proxy_responses 0;」在流的'服務器'部分,並且錯誤消失。這基本上告訴nginx不要期待響應,這很好。我想要運行health_check,但似乎該選項可能只能在商業版本中使用。 – jasonmclose

回答

6

所以這似乎確實是解決方案(在我上面的註釋中)。

如果使用我上面的例子中,你要這個樣子:

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

這告訴nginx不要指望的響應,它不應該從UDP需要。我不知道爲什麼他們的examples在討論DNS時沒有顯示這一點,而DNS可以完全由UDP驅動。