我的日志logging设置是一个单一的Docker主机,UDP 514暴露给syslog。 一个nginx容器的端口已经发布,所以当你发送日志到10.1.1.100(在下面的图片中),它首先命中nginx,其configuration为透明负载平衡Logstash容器是:
user root; events {worker_connections 32768;} stream { upstream logstash_servers { server logstash-collector-01:514; server logstash-collector-02:514; server logstash-collector-03:514; } listen 514 udp; proxy_pass logstash_servers; proxy_bind $remote_addr transparent; } }
这工作正常。 但是,TCP 514(或任何TCP,就此而言)不是。 即使当我添加了正确的监听器和configuration,我相信TCP握手并没有完成,因为在nginx做透明的负载平衡,它的proxy_bind传递,例如10.1.1.5作为源IP到例如172.18.0.4(一个Logstash实例)。 然后,该实例尝试完成握手,但10.1.1.5(以及任何路由器)不知道如何路由到172.18.0.0/16的Dockernetworking。
有没有一种解决scheme可以使用TCP进行日志logging?
这听起来像nginx可能不是这里工作的最佳工具 – 要么haproxy(如果你想要简单的TCP / UDP负载平衡),或rsyslog(如果你想稍微更多的应用程序意识)看起来更适合,并会完成与nginx目前相同的function。
看看你的设置,你甚至可以在514上有一个前端的logstash监听器,它可以转发到另一个logstash实例进行实际的处理。 由于logstash不AFAIK做负载平衡,您可以改为基于您放置的一些标签/types“路由”事件。
检查https://www.nginx.com/resources/admin-guide/tcp-load-balancing/ ,为了同时拥有TCP和UDP,你需要这样的东西:
stream { upstream logstash_servers { server logstash-collector-01:514; server logstash-collector-02:514; server logstash-collector-03:514; } server { listen 514; ... } server { listen 514 udp; ... } }
我不完全清楚在UDP服务器块中使用logstash_servers是否会导致nginx向其讲话UDP或TCP,因此您可能需要使两者都可用。
当连接到logstash后端时,我会怀疑这个问题是否属于使用“错误的”IP作为源的nginx节点 – 通常,您的nginx前端将使用任何“正确的”IP来做到这一点,在你的情况下,将意味着在172.18 / 16内的地址。 这与反向代理到localhost时使用nginx类似:在这种情况下,nginx将使用源IP为127.0.0.1(或者:: 1)的本地主机应用程序进行通信,而不是nginx看到请求来自的IP 。
还有一个事实,就是你似乎在说这一切都适用于UDP – 这往往会说路由不是一个问题,而是TCP设置中的某些东西。